2012-01-09 3 views
5

Ho tre file enormi, con solo 2 colonne e ho bisogno di entrambi. Voglio unirli in un unico file che posso quindi scrivere su un database SQLite.Un modo rapido per unire file enormi (> = 7 GB) in uno

Ho usato Python e ho completato il lavoro, ma ci sono voluti> 30 minuti e ho anche bloccato il mio sistema per 10 di questi. Mi stavo chiedendo se c'è un modo più veloce usando awk o qualsiasi altro strumento Unix. Anche un modo più veloce all'interno di Python sarebbe fantastico. Codice scritto sotto:

'''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

Perché non caricare i file in SQLite uno alla volta? – rjmunro

+0

Ho pensato che questo richiederà un tempo uguale, se non più lungo. Più a lungo coz la seconda volta che lo faccio, deve accodare i dati esistenti e così, ho pensato che questo sarà ugualmente costoso, se non di più – crazyaboutliv

+0

Solo un commento. Il tuo codice sarebbe più facile da leggere se avessi chiamato gli oggetti file input1, input2, input3 e output1. –

risposta

12

Il metodo standard Unix per unire file è cat. Potrebbe non essere molto più veloce ma sarà più veloce.

cat file1 file2 file3 > bigfile 

Piuttosto che fare un file temporaneo, si può essere in grado di cat direttamente SQLite

cat file1 file2 file3 | sqlite database 

in Python, si sarà probabilmente ottenere prestazioni migliori se si copia il file in blocchi, piuttosto che linee. Utilizzare file.read(65536) per leggere 64k di dati alla volta, piuttosto che scorrere i file con for

+0

Grazie. Darò una prova al gatto :) Triste, non potevo pensare al gatto prima però :( – crazyaboutliv

+0

'leggi (65536)' ... intelligente! – juliomalegria

+0

Sarei davvero interessato a vedere la risposta definitiva sulla dimensione del blocco più efficiente. ad un certo punto stiamo provando a indovinare il sistema operativo: –

2

Sui sistemi UNIX-like:

cat file1 file2 file3 > file4 
1

Suppongo che sia necessario ripetere questo processo e che la velocità è un fattore critico.

Provare ad aprire i file come file binari e sperimentare con le dimensioni del blocco che si sta leggendo. Prova 4096 e 8192 byte in quanto sono le dimensioni del buffer sottostante di base.

C'è una domanda simile, Is it possible to speed-up python IO?, che potrebbe essere di interesse anche.

+0

Grazie! – crazyaboutliv

Problemi correlati