2012-01-09 6 views
5

Tengo tres archivos enormes, con solo 2 columnas, y los necesito a ambos. Quiero fusionarlos en un archivo que luego puedo escribir en una base de datos SQLite.Forma rápida de combinar archivos enormes (> = 7 GB) en uno

Utilicé Python y terminé el trabajo, pero me tomó> 30 minutos y también colgué mi sistema para 10 de esos. Me preguntaba si hay una manera más rápida usando awk o cualquier otra herramienta de Unix. Una forma más rápida dentro de Python sería genial también. El código escrito a continuación:

'''We have tweets of three months in 3 different files. 
Combine them to a single file ''' 
import sys, os 
data1 = open(sys.argv[1], 'r') 
data2 = open(sys.argv[2], 'r') 
data3 = open(sys.argv[3], 'r') 
data4 = open(sys.argv[4], 'w') 
for line in data1: 
    data4.write(line) 
data1.close() 
for line in data2: 
    data4.write(line) 
data2.close() 
for line in data3: 
    data4.write(line) 
data3.close() 
data4.close() 
+0

¿Por qué no cargar los archivos en SQLite de a uno por vez? – rjmunro

+0

Pensé que esto tomaría igual, si no más tiempo. Ya la segunda vez que lo hago, tiene que adjuntarse a los datos existentes, así que supuse que sería igualmente caro, si no más. – crazyaboutliv

+0

Solo un comentario. Su código sería más fácil de leer si hubiera nombrado los objetos del archivo input1, input2, input3 y output1. –

Respuesta

12

La forma estándar de Unix para unir los archivos es cat. Puede que no sea mucho más rápido, pero será más rápido.

cat file1 file2 file3 > bigfile 

En lugar de hacer un archivo temporal, que puede ser capaz de cat directamente a SQLite

cat file1 file2 file3 | sqlite database 

en Python, es probable que obtener un mejor rendimiento si se copia el archivo en bloques en lugar de líneas. Use file.read(65536) para leer 64k de datos a la vez, en lugar de recorrer los archivos con for

+0

Gracias. Voy a darle una oportunidad al gato :) Triste No pude pensar en el gato antes :( – crazyaboutliv

+0

'leer (65536)' ... ¡listo! – juliomalegria

+0

Estaría realmente interesado en ver la respuesta definitiva en el tamaño de bloque más eficiente. en algún punto estamos tratando de adivinar el SO. –

2

En sistemas UNIX:

cat file1 file2 file3 > file4 
1

Supongo que debe repetir este proceso y esa velocidad es un factor crítico.

Intente abrir los archivos como archivos binarios y experimente con el tamaño del bloque que está leyendo. Pruebe 4096 y 8192 bytes ya que estos son tamaños de búfer subyacentes comunes.

Hay una pregunta similar, Is it possible to speed-up python IO?, que también podría ser de su interés.

+0

Gracias! Voy a ver el enlace – crazyaboutliv

Cuestiones relacionadas