質問
しています店舗につファイルA、Bの両方が非常に大規模様100GB).しかしBが同様の大きな部品をこの店舗との差(A,B).ある面白さにこの問題:
- ファイルが大きすぎるので分析されることによdiff図書館んなメモリ
- んが、実際に必要なデ-差分がホットスポット、または挿入、編集、削除では、読み込まれる。まだ少ない情報:かみ"のバイト"と"コピーバイトからの古いファイルから任意のオフセット".
私は現在失などを計算するためのデルタのかわから。なんだろうけど、日本人のアルゴリズムです。
まさにこの問題はシンプルです:書きるアルゴリズムを保存できるファイルA、B、わずかなバイトはできることもできていることが分かります。
追加情報:が大部分が同一でなければならないが異なるオフセットする。最後はなぜ、従来のdiffが保存されない。
解決
、RSYNCsアルゴリズムを見てみましょう。今思い出すと、アルゴリズムはかなりよく、文書化されます。
他のヒント
利用できる rdiff
, は、非常に大きいファイルです。ここで私が作成した差分の二つの大きなファイル A
や B
:
署名を作成のファイル、例えば
rdiff signature A sig.txt
を用い、生成された署名ファイル
sig.txt
その他の大きなファイルを作成し、デルタ:rdiff delta sig.txt B delta
現在
delta
すべての必要な情報を再現ファイルB
きA
やdelta
.再B、rdiff patch A delta B
Ubuntuの走り sudo apt-get install rdiff
をインストールしてください。でかなり速い車で約40メガバイト/秒の自分のパソコン。私たで8GBファイルのメモリ使用によるrsyncした約1MB.
それが問題として知られ "データの重複排除".を用いるのが一般的です:
- 読みのファイルをブロック
なデータの重複排除圧縮アルゴリズムは正確な例として xdelta, でもより速く、スケーラブルには大量のデータセット。のチャンキングや指紋押捺された約50MB/sのコア当たりの(Java).指数の削減のチャンクサイズのデータのサイズです。200GBい合わせ用のメモリチャンクのサイズの例16KB.
BentleysとMciloys 圧縮アプローチは非常に類似の使用例によるGoogles BigTable)しかし、私はよく知らないのはボックスのコマンドラインツールの圧縮技術で
の "fs-c" オープンソースプロジェクトを含む多くのコードが必要です。しかし、fs-cそのものを測定、削減のanalzyeファイルをメモリを使 Hadoop クラスター
一つの質問に対しては何のサイズをファイル、でのオフセットの変更にバイトをバイトのファイルは、1024Bブロックとなります。を想定したデータをバイト指向の、なにができるの
を接尾辞配列をファイルA.この配列は完全ての環境保全効果を表す指標の値は、ファイルA.場合は2^37バイトのインデックス配列番で表される64ビット整数型、バイト(オフセットのファイル)に対応する8バイトのインデックス配列のインデックス配列が2^40バイトの長さです。E.g.800GB言うまでもない。こともでき込み指数を除く毎1024th位置、サイズを縮小の指標配列に格納します。この後detoriatesの品質の包装によってどのように平均のcopyable断片ます。
今後欲張パックのファイルBきその開始オフセットo=0を使用してインデックス配列の長い試合に一致するデータから'o'.ご出力に対し、満員のファイルです。これおなき場合のエンコーディング16バイトなので < 16バイトそのような空間です。このハを使用してビットレベルのエンコードをビットマーカーをマークからエンコードの孤立バイトマーカー+8ビット=9ビットまたはオフセット/長さペア(マーカー+40ビット+40ビット=81ビット単位)、言うまでもない。後の梱包の最長の断片でo,増oめの次のバイト後の断片まで繰り返しのファイルです。
の構築と利用の接尾辞配列はすべきものを参照す。高速用途に使う接尾辞木に接尾辞となる複雑な操作ない、より迅速でルックアップ.お場合において配列の二次保管場合は走行速度の包装の位相問題を解決接尾辞配列は十分です。
あなたのパフォーマンス要件に応じて、あなたは指紋チャンクをサンプリングし、それらが一致したときにそれらを成長させることで逃げることができました。その方法は、あなたがあなたの全体の大きなファイルのチェックサムを実行する必要はありません。
あなたが任意のバイトアライメントを必要とし、あなたが本当にパフォーマンスを気にする場合は、 simhashする < href = "http://svcs.cs.pdx.edu/gitweb/simhash.git" のrel = "nofollowをnoreferrer">アルゴリズムの、と似ているが整列していないブロックを見つけるためにそれを使用します。