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


31

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

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

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

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


どのバージョンのxdeltaを試しましたか?xdelta3またはxdelta1?
nmuntz

バージョン1.1.4でした。xdelta3は異なる機能を提供しますか?オンラインドキュメントを確認したところ、まだ「デルタ」を提供しているようです。
トムB


この回答も参照してください:unix.stackexchange.com/a/77259/27186
unhammer

回答:


12

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

脇:ここケース他人の土地では(非常に大きなファイルを含む)は、2つのディレクトリ構造が同一であることを確認する方法を探していたときに diff --recursive --brief(またはdiff -r -q多分短い、またはのためにdiff -rq働くとメモリのうち実行されません)。


素敵で、私は...何とかそれはメモリにファイル全体(または少なくとも全体のラインを)入れて差分を必要とすることができます持っていない、-qはここで重要だと思う
rogerdpack

7

このリンクを見つけました

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

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


1
これはそこにいる誰かに役立ちますか?私にとっては、同じ失敗...
rogerdpack

12
疑問に思う人のために:diff -Hは、ドキュメント化されておらず、廃止されたのエイリアスですdiff --speed-large-files
a3nm

1
この答えは役に立ちません。これはLinuxの質問です。2bsd-diffをインストールするには、まず移植する必要があります。ソース見つけた後。そしてそれをパッチしました。可能ですが、実行可能なソリューションではありません。
nyov

1

数バイトの値を除いてファイルが同一(同じ長さ)の場合、次のようなスクリプトを使用できます(whexdumpの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

それは非常に高速ではありませんが、仕事をします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.