2011-02-04 17 views
5

Mam dwa duże pliki tekstowe, około 2 GB każdy. Potrzebuję czegoś takiego jak diff f1.txt f2.txt. Czy istnieje sposób na szybkie wykonanie tego zadania w pythonie? Standard difflib jest zbyt wolny. Zakładam, że jest szybszy sposób, ponieważ difflib jest w pełni zaimplementowany w Pythonie.diff dwa duże pliki w Pythonie

+6

Dlaczego nie użyć 'diff f1.txt f2.txt'? – delnan

+1

@delnan: ponieważ spowoduje to, że moja platforma skryptów będzie zależna. Pobierz diff plików to tylko jedna z innych części skryptu. –

+0

Czy możliwe jest wypróbowanie tego przy pomocy przyspieszenia psyco lub kompilacji Unladen Swallow lub PyPy? – ncoghlan

Odpowiedz

4

Co powiesz na używanie difflib w taki sposób, że skrypt może obsłużyć duże pliki? Nie ładuj plików do pamięci, ale przeglądaj pliki plików i zmieniaj porcje. Na przykład 100 linii na raz.

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

Tak, próbowałem podobnego skryptu. Zbyt powolny :( –

+0

Inną szybką i przenośną opcją byłoby poproszenie użytkowników o zainstalowanie narzędzia diff dla platformy, a następnie użycie tego za pomocą opakowania Pythona –

+0

"difflib" Pythona jest po prostu powolny, niezależnie od tego, co robisz. Dwa prawie identyczne pliki 1 MB każdego, weź mi 0,5 sekundy w najlepszym przypadku i kilka minut w najgorszym przypadku Binarna różnica wynosi 0,033 sekundy. – Pithikos

Powiązane problemy