web-dev-qa-db-ja.com

2つの大きなテキストファイルの比較

2つの大きなファイル(各6 GB)があります。それらはソートされておらず、改行(\n)セパレータとして。どうすればそれらを比較できますか? 24時間未満かかるはずです。

34
jonasl

最も明白な答えは、単にdiffコマンドを使用することであり、それに--speed-large-filesパラメータを追加することはおそらく良い考えです。

diff --speed-large-files a.file b.file

ソートされていないファイルについて言及しているため、最初にファイルをソートする必要があるかもしれません

sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted

2番目のソート出力をdiffに直接パイプすることで、追加の出力ファイルの作成を節約できます

sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -

明らかに、これらは十分な空きメモリがあるシステムで最もよく動作し、おそらく十分な空きディスク領域も必要になります。

以前にこれらを試したことがあるかどうかは、質問から明確ではありませんでした。もしそうなら、何がうまくいかなかったのか(長すぎたなど)を知ることは役に立ちます。私はいつも、ファイルの非常にドメイン固有のプロパティが異なって何かを行うことを可能にするものでない限り、stock sortコマンドとdiffコマンドは少なくともカスタムコマンドと同じように機能する傾向があることを発見しました。

47
Richm

入力をソートし、diffプログラムにその入力がソートされていることを伝えると、速度が大幅に向上します。そのようなオプションを備えたdiffは知りませんが、commはソートされた入力を想定しているため、目的に十分に対応できればはるかに高速になります。

5
Karl