Cómo fusionar 8 archivos CSV (49 millones de filas cada uno) con una columna común, y exportar el resultado final a un CSV en una PC Core i7 8GB RAM

¿Cómo combino 8 archivos CSV (49 millones de filas cada uno) con una columna común y exporto el resultado final a un CSV en una PC Core i7 de 8 GB de RAM?

Mi respuesta instintiva es Miller, un conjunto de herramientas CSV basado en C que es similar a csvkit que Bill Weiner sugirió. Sin embargo, después de generar 8 archivos CSV llamados t1.csv través de t8.csv con:

  • serial + 20 otras columnas con nombre (ninguna de las cuales tiene el mismo nombre)
  • 20,000,000 filas ( serial ejecuta de 1 a 2 0000000 , todas las demás columnas con números aleatorios)
  • 2,5 GB de gran tamaño

ni Miller ni csvkit pudieron unir los 8 archivos en mi computadora portátil Core i7 8GB RAM. Ambos masticaron todo mi intercambio de RAM +, mi computadora portátil dejó de responder por un tiempo y el temido asesino OOM de Linux finalmente tipeó ambos cerdos de memoria.

Esto se debe a que ambos kits de herramientas CSV no hacen suposiciones sobre sus archivos de entrada y, por lo tanto, tienen que hacer una clasificación previa y muchas otras cosas que finalmente terminan leyendo / mapeando archivos completos en la memoria. Obviamente, esto no escala.

Aquí hay un par de alternativas que he probado para que funcionen y admitan CSV mucho más grandes que la RAM disponible:


La solución genérica es importar sus CSV en una base de datos relacional . Es posible que ya esté planeando cargar todos sus CSV en una base de datos para su posterior procesamiento y análisis, y solo necesita deshacerse de un CSV combinado para otros fines.

La mayoría de los DB relacionales tienen opciones para generar resultados SELECT en formato CSV, y SQL le permite, bueno, UNIRSE.

Con SQLite, por ejemplo:

– Importar cada CSV en una tabla separada
.import t1.csv t1
.import t2.csv t2
.import t3.csv t3
.import t4.csv t4
.import t5.csv t5
.import t6.csv t6
.import t7.csv t7
.import t8.csv t8

– Establecer el modo de salida CSV, con encabezados
.mode csv
encabezados en
.output result.csv

– Ahora ÚNETE a todos juntos
SELECCIONAR * DESDE t1
ÚNETE t2 USANDO (serial)
ÚNETE t3 USANDO (serial)
ÚNETE t4 USANDO (serial)
ÚNETE t5 USANDO (serial)
ÚNETE t6 USANDO (serial)
ÚNETE t7 USANDO (serial)
ÚNETE t8 USANDO (serial)
PEDIDO POR SERIE;

No es muy rápido, pero no tiene que preprocesar sus datos de ninguna manera. También puede elegir su método de combinación, que es muy útil cuando algunos valores en su columna común solo aparecen en algunos archivos.


Dado que todos los archivos ya están ordenados en la columna de serie, hay un acceso directo que funciona en todas las plataformas * nix que he visto, un canal de unión:

unirse –header -t, t1.csv t2.csv |
unirse –header -t, – t3.csv |
unirse –header -t, – t4.csv |
unirse –header -t, – t5.csv |
unirse –header -t, – t6.csv |
unirse –header -t, – t7.csv |
unirse a –header -t, – t8.csv> result.csv

Esta es, con mucho, la forma más rápida y eficiente de memoria para hacer esto, pero requiere entradas ordenadas. Además, lo anterior solo genera el equivalente de una unión interna SQL (es decir, la intersección en la columna común en todos los archivos de entrada). Emular otros tipos de unión SQL es sorprendentemente complicado.

En Linux

Cat file1.csv file2.csv file3.csv file4.csv file5.csv file6.csv file7.csv file8.csv> final.csv

O puedes hacerlo de nuevo en Linux

para i en $ (seq 1 8)

hacer

Archivo Cat [$ i] >> final.csv

hecho

Final.csv será su archivo fusionado. Al usar el bucle, recuerde cambiar el nombre de los archivos como se indica arriba

Si simplemente desea fusionarlos uno tras otro, puede intentar usar el comando cat en Linux y canalizar la salida a un archivo.

gato *. csv >> salida. csv

Si esto no funciona, se puede hacer fácilmente a través de algo como herramientas de big data como spark o colmena, ya que los datos están estructurados. Prueba databricks. Puede ejecutar chispa en línea allí. Cargue sus archivos, escriba un código de chispa y luego descargue el archivo combinado. Puede encontrar muchos ladrillos de datos y documentación de chispas en línea.

He visto la solución de Linux (equivalente) aquí usando el comando cat. Sin embargo, puede hacer lo mismo con el comando COPIAR en Windows. Abra un símbolo del sistema y asegúrese de estar en el directorio donde se encuentran sus 8 CSV. Luego, escriba: copy * .csv

Esto creará un nuevo CSV llamado deseado_nombre … .csv

¡Espero que ayude!

A partir de la estructura de la pregunta, deduzco que está buscando “unir” los archivos en función de la columna común. Algunas columnas de datos que provienen de un archivo y otras columnas de los otros archivos se unen en función de la columna común.

Por lo tanto, es posible que desee probar un conjunto de herramientas csv: csvkit 1.0.2, documentación csvkit 1.0.2, este conjunto de herramientas hace un buen trabajo. Puede convertir y operar archivos csv con estas herramientas. Uno de ellos es csvjoin, que puede satisfacer sus necesidades. Si estoy fuera de lo que está tratando de hacer, estas herramientas son una buena fuente de las utilidades que probablemente puedan hacer lo que necesita.

El tamaño de los archivos es mi única preocupación. Creo que las herramientas funcionarán en este tamaño (en una cierta cantidad de tiempo) si tienes suficiente memoria. Estos tamaños de archivo y unión no son nada para que una base de datos opere.

Todo lo mejor

Como nadie lo ha mencionado todavía, la solución excesiva sería usar algo como Spark en su máquina local. Le dará acceso esencialmente a la sintaxis completa de SQL y usará el disco si es posible para minimizar el uso de memoria. Requiere una configuración no trivial, por eso dije que es la solución exagerada.

Comience con PySpark y Jupyter Notebook en 3 minutos

Hay una utilidad visual gratuita para fusionar archivos de texto: Eaymorph, Talend, etc.

No estoy seguro de si puede manejar 49 millones de filas, pero trabajé con 10 millones en Easymorph. Esto se puede hacer en EasyMorph usando la transformación Append. Luego, exporte a Excel, si es necesario.

More Interesting

¿Qué hace que un teléfono sea realmente inteligente si no tomamos en cuenta la cámara, el procesador, la RAM o el PPI?

¿Qué es una RAM y cómo la enciendo?

¿Mi computadora puede manejar 16GB de RAM?

¿Cuál sería un buen teléfono inteligente con menos de Rs 10,000 con una RAM de 2 GB y una cámara de 13 MP?

¿Qué placa base y procesador se adaptan mejor a la RAM DDR4?

¿Por qué las placas del sistema AMD solo tienen 4 ranuras de RAM?

¿Existe una versión más grande de RAM DDR2?

¿Cómo funciona DRAM?

Para computadoras / PC / Android, ¿no hay otra solución tecnológica que no sea simplemente un salto en las especificaciones (RAM, VRAM y procesadores)?

Hay muchos teléfonos Android con 3 GB de RAM, ¿cómo se asegura de cuál es el mejor en términos de rendimiento?

Si los teléfonos inteligentes pueden administrar 8 GB de RAM en un factor de forma tan pequeño, ¿por qué los Ultrabooks y las computadoras portátiles todavía tienen esos feos módulos DDR4 RAM?

Mi computadora portátil tiene un AMD A8-6410 con gráficos Radeon R5 integrados. Muestra que ha mantenido 512 MB de memoria como memoria gráfica dedicada. ¿Aumentar la RAM también aumentará el tamaño de la memoria gráfica dedicada?

¿Puede la RAM no volátil (MRAM, FRAM) hacer que Python sea más rápido?

¿Hay alguna forma de jugar FIFA 15 en computadoras portátiles con 4 GB de RAM y tarjeta gráfica de 1 GB?

¿Podría jugar WWE2K15 en mi PC que tiene 8GB de RAM y 512 mb de AMD Radeon 6330HD?