2012-04-24 4 views
0

私はtxtファイルAを300、000 +ライン、txtファイルBを600、000 +ラインで取得しました。今私がしたいのは、ファイルAをファイルごとに見比べることです。その行がファイルBに表示されない場合は、ファイルCに追加されます。巨大なファイルBからPythonを使用した場合と比較して、巨大なファイルAからのユニークな行を見つける最速の方法は何ですか?

問題は、私が言ったようなものですすべての仕事を終わらせるために、文字通り年月がかかります。だからこれを行うには良い方法がありますか?

+0

ファイル。同様に、あなたが* nixにいる場合、diffツールもこれを行うことができます。 – hexparrot

+1

* nixプラットフォームを使用している場合は、これを行うためにバッチを使用することをお勧めします(これはPythonからbashコマンドを呼び出すことができます)。diff -suppress-common-lines -y <(sort file1)<ソートファイル2) – pcalcao

+0

有用な並べ替えの種類:文字は1バイト、行は(たとえば)75文字なので、ファイル全体をメモリに読み込むには '600000 * 75/1000000 = 45MB' 。最近はそれほど簡単ではないので、両方のファイルをメモリに読み込んで比較するだけです。もちろん、かなり大きなファイルで作業していた場合は、それを実行できませんでした。 – katrielalex

答えて

14

これはかなり高速である必要があります:これはあなたが絶対にあなたがこれを使用することができますAから順番を維持する必要がある場合はAまたはBにあった任意の順序を無視すること

with open("a.txt") as a: 
    with open("b.txt") as b: 
     with open("c.txt", "w") as c: 
      c.write("".join(set(a) - set(b))) 

注:

with open("a.txt") as a: 
    with open("b.txt") as b: 
     with open("c.txt", "w") as c: 
      b_lines = set(b) 
      c.write("".join(line for line in a if not line in b_lines)) 
setにファイルB内のすべての行で
+0

nice。 +1。 'c 'の順序は' a'と同じにする必要がない限り、これを正式な回答として受け入れるべきだと思う... –

+0

@ nightcracker:ありがとう、これは本当に高速です!乾杯! – Shane

+0

@シェーン:私の答えがあなたの問題を解決した場合は、私の答えの左側にあるチェックボックスをクリックしてそれを受け入れることを検討してください。 – orlp

0

Pythonについては何も知らないけど、ファイルAを特定の順序でソートするのはどうですか?その後、ファイルごとに行単位で検索し、バイナリ検索を行うことができます。より効率的です。

0

読む:

blines = set(file_b) 
for line in file_a: 
    if not line in blines: 
     append_to_file_c 

600K +はreallされていませんyその多くのデータ...

+0

リストの理解の必要はなく、このファイルは1行ずつ生成されます。順序を保持したい場合を除いて、 'set(file_b)' – jamylak

+0

@jamylakを呼び出すことができます。C内の行は、B内に見つかった欠けている行を除いて、Aと同じ順序になります。 –

+0

それは順序を保持しません。 – jamylak

1

Bをメモリに保存できますか?その場合は、ファイルBを読み込んで、それに含まれるすべての行を含む索引を作成します。次に、行ごとに行を読んで、その行が索引に表示されているかどうかを確認します。 http://docs.python.org/library/difflib.htmlはほぼ確実に1行が他にあるかどうかを確認するために、任意のシンプルなデザインよりも多くの検索効率的になるだろうされ、使用のかもしれません

with open("B") as f: 
    B = set(f.readlines()) 

with open("A") as f: 
    for line in f.readlines(): 
     if line not in B: 
      print(line) 
+0

'readlines()'を呼び出す必要はありません。 – jamylak

関連する問題