2011-02-04 10 views
5

Ho due grandi file di testo, ciascuno vicino a 2 GB. Mi serve qualcosa come diff f1.txt f2.txt. C'è un modo per fare questo compito veloce in Python? Lo standard difflib è troppo lento. Presumo che ci sia un modo più veloce, perché difflib è completamente implementato in Python.diff due grandi file in Python

+6

Perché non utilizzare 'diff f1.txt f2.txt'? – delnan

+1

@delnan: perché renderà la mia piattaforma di script dipendente. Ottenere la differenza tra i file è solo una delle altre parti dello script –

+0

È possibile provarlo con l'accelerazione di psyco o con Unladen Swallow o PyPy build? – ncoghlan

risposta

4

Come utilizzare difflib in modo che lo script possa gestire file di grandi dimensioni? Non caricare i file in memoria, ma scorrere i file dei file e diff in blocchi. Ad esempio, 100 righe alla volta.

import difflib 

d = difflib.Differ() 

f1 = open('bigfile1') 
f2 = open('bigfile2') 

b1 = [] 
b2 = [] 

for n, lines in enumerate(zip(f1,f2)): 
    if not (n % 100 == 0): 
     b1.append(lines[0]) 
     b2.append(lines[1]) 
    else: 
     diff = d.compare("".join(b1), "".join(b2)) 
     b1 = [] 
     b2 = [] 
     print ''.join(list(diff)) 

diff = d.compare("".join(b1), "".join(b2)) 
print ''.join(list(diff)) 
f1.close() 
f2.close() 
+1

sì, stavo provando una sceneggiatura simile. Troppo lento :( –

+0

L'altra opzione veloce e portatile sarebbe chiedere agli utenti di installare diff utility per la piattaforma e quindi utilizzarla tramite python wrapper. –

+0

Il 'difflib' di Python è lento solo non importa quello che fai. 1 MB ciascuno, prendi 0,5 secondi al migliore dei casi e pochi minuti nel caso peggiore. Il differenziale binario richiede 0,033 secondi. – Pithikos