web-dev-qa-db-ja.com

Linuxで大きなファイルを比較する方法

diff: memory exhausted CentOS 5と4 GBのRAMを搭載したLinuxボックスでほぼ同様の2つの27 GBファイルを比較しようとすると、エラーが発生します。これは既知の問題であるようです。

そのような重要なユーティリティの代替手段があると思いますが、それを見つけることができません。ソリューションでは、必要な情報を保存するために、メモリではなく一時ファイルを使用する必要があると思います。

  • rdiffxdeltaを使用しようとしましたが、パッチのように2つのファイル間の変更を示すのに適しているため、2つのファイルの違いを調べるのにはあまり役に立ちません。
  • 試してみました VBinDiff ですが、バイナリファイルを比較するための視覚的なツールです。通常のdiffのように、違いをSTDOUTにパイプできるものが必要です。
  • vimdiffなどの他のユーティリティには、小さいファイルでしか機能しないものがたくさんあります。
  • Solaris bdiffについても読みましたが、Linux用のポートが見つかりませんでした。

ファイルを小さな部分に分割する以外のアイデアはありますか?私はこれらのファイルを40個持っているので、それらを分割する作業を回避しようとしています。

32
Tom B

cmpはバイト単位で処理を行うため、おそらくメモリ不足にはなりません(2つの7 GBファイルでテストしただけです)-"ファイルのリストよりも詳細を探している可能性があります[〜#〜] x [〜#〜]および[〜#〜] y [〜#〜]バイトが異なるx、行y "。ファイルの類似性がオフセットされている場合(たとえば、ファイル[〜#〜] y [〜#〜]には同じテキストブロックがあるが、同じ場所にない)、オフセットをcmp;おそらく、それを小さなスクリプトとの再同期比較に変えることができます。

余談:2つのディレクトリ構造(非常に大きなファイルを含む)が同一であることを確認する方法を探しているときに誰かがここに着いた場合:diff --recursive --brief(またはdiff -r -q略して、あるいはdiff -rq)は機能し、メモリ不足にはなりません。

12
Felix

私はこれを見つけました link

diff -Hが役立つ場合があります。または、ファイルをRAMにロードしないように見えるtextproc/2bsd-diffポートをインストールしてみることで、大きなファイルをより簡単に処理できるようになります。

これら2つのオプションを試したのか、それともうまくいくのかわかりません。幸運を。

7
Jarvin

数バイトの値を除いてファイルが同一(同じ長さ)の場合、次のようなスクリプトを使用できます(wは、16進ダンプする1行あたりのバイト数で、ディスプレイの幅に合わせて調整します)。

w=12;
while read -ru7 x && read -ru8 y;
do
  [ ".$x" = ".$y" ] || echo "$x | $y";
done 7< <(od -vw$w -tx1z FILE1) 8< <(od -vw$w -tx1z FILE2) > DIFF-FILE1-FILE2 &

less DIFF-FILE1-FILE2

それはそれほど速くはありませんが、仕事をします。

1
Tino