私はtxtファイルAを300、000 +ライン、txtファイルBを600、000 +ラインで取得しました。今私がしたいのは、ファイルAをファイルごとに見比べることです。その行がファイルBに表示されない場合は、ファイルCに追加されます。巨大なファイルBからPythonを使用した場合と比較して、巨大なファイルAからのユニークな行を見つける最速の方法は何ですか?
問題は、私が言ったようなものですすべての仕事を終わらせるために、文字通り年月がかかります。だからこれを行うには良い方法がありますか?
私はtxtファイルAを300、000 +ライン、txtファイルBを600、000 +ラインで取得しました。今私がしたいのは、ファイルAをファイルごとに見比べることです。その行がファイルBに表示されない場合は、ファイルCに追加されます。巨大なファイルBからPythonを使用した場合と比較して、巨大なファイルAからのユニークな行を見つける最速の方法は何ですか?
問題は、私が言ったようなものですすべての仕事を終わらせるために、文字通り年月がかかります。だからこれを行うには良い方法がありますか?
これはかなり高速である必要があります:これはあなたが絶対にあなたがこれを使用することができます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内のすべての行で
Pythonについては何も知らないけど、ファイルAを特定の順序でソートするのはどうですか?その後、ファイルごとに行単位で検索し、バイナリ検索を行うことができます。より効率的です。
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)
'readlines()'を呼び出す必要はありません。 – jamylak
ファイル。同様に、あなたが* nixにいる場合、diffツールもこれを行うことができます。 – hexparrot
* nixプラットフォームを使用している場合は、これを行うためにバッチを使用することをお勧めします(これはPythonからbashコマンドを呼び出すことができます)。diff -suppress-common-lines -y <(sort file1)<ソートファイル2) – pcalcao
有用な並べ替えの種類:文字は1バイト、行は(たとえば)75文字なので、ファイル全体をメモリに読み込むには '600000 * 75/1000000 = 45MB' 。最近はそれほど簡単ではないので、両方のファイルをメモリに読み込んで比較するだけです。もちろん、かなり大きなファイルで作業していた場合は、それを実行できませんでした。 – katrielalex