2011-02-04 15 views
5

2つの大きなテキストファイルがあり、それぞれ2GB近くあります。 diff f1.txt f2.txtのようなものが必要です。このタスクを高速に行う方法はありますか?標準difflibが遅すぎます。 difflibはPythonで完全に実装されているので、より速い方法があると私は想定しています。diff 2つの大きなファイルをPythonで返します

+6

なぜ「diff f1.txt f2.txt」を使用しないのですか? – delnan

+1

@delnan:スクリプトプラットフォームに依存するためです。ファイルの差分を取得するには、スクリプトの他の部分のいずれか1つだけです –

+0

psycoアクセラレーションまたはUnladen SwallowまたはPyPyビルドで試してみるのは可能でしょうか? – ncoghlan

答えて

4

スクリプトが大きなファイルを処理できるようにdifflibを使用することはどうですか?ファイルをメモリにロードせず、ファイルのファイルを繰り返し、チャンク内のdiffを実行します。たとえば、一度に100行。

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

はい、私は同様のスクリプトを試していました。あまりにも遅い:( –

+0

あなたの他の高速かつ移植可能なオプションは、プラットフォームのdiffユーティリティをインストールし、Pythonラッパーを介してそれを使用するようにユーザーに依頼するでしょう。 –

+0

Pythonの 'difflib'は、あなたが何をしても遅いです。最高の場合は0.5秒、最悪の場合は数分かかります。バイナリ差分は0.033秒かかります。 – Pithikos

関連する問題