多くの同様の大きなファイルを圧縮する


18

圧縮したい類似の大きなファイル(それぞれ30メガバイト)が何百もあります。ファイルのすべてのペアには、99%の同じデータ(1%未満の差)があるため、40〜50メガバイトを超えるアーカイブはないはずです。

単一ファイルは(と13〜15メガバイトに30メガバイトから圧縮することができxz -1gz -1bzip2 -1)、2つの以上のファイルを圧縮するとき、私はサイズのアーカイブを持ちたい13-15MB + N*0.3MBNは、ファイルの数です。

使用している場合tar(ソリッドアーカイブを作成する)とxz -6( - 1つのファイルよりも大きくなるように圧縮辞書を定義するアップデート! -これは十分ではなかった)、私はまだサイズのアーカイブを持っていますN*13MB

辞書は1 MB未満であり、私のtarストリームは30 MBごとに繰り返しているため、両方とも私には役に立たないgzipと思いますbzip2

標準ツールを使用して現代のLinuxで問題をアーカイブするにはどうすればよいですか?

xz高速に圧縮するように調整することは可能ですが、30〜60 MBより大きい辞書を使用しますか?

更新tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz。の必要性mf=hc4--memory=2Gオプションについてはわかりません。ただしdict=128M、辞書を十分に大きく(1つのファイルよりも大きく)設定し、mode=fastプロセスを-e


実行xz -1 --memory=2Gは役に立たず、セットの2つと4つのファイルでテストされました。
osgx 14年

回答:


12

あなたの詳細を考えると、あなたはあなたのファイルが本当に99%のデータを共有し、それらの連続した(またはほぼ連続した)1%の違いがあることを検証したと仮定します。

まず、tarを使用して、ファイルをその中に含む1つのアーカイブを作成する必要があります。テストでは、10個のファイルを含む.tarを作成するため、サイズは300MBになります。

次に、xzを使用して、辞書が1つのファイルのサイズより大きくなるように設定する必要があります。メモリ制限があるかどうかは言わないので、xz -9を使用します。使用可能なメモリをすべて使用しなくても意味はありません。

また、--extremeプリセットを使用して、違いが生じるかどうかをテストします。

辞書サイズ

私が利用できるドキュメントの1つ- サイト -では、ディクショナリのサイズは解凍プログラムのメモリ使用量とほぼ等しいと言われています。また、-1パラメーターは1MiBのディクテーションを意味し、-6は10 MiB(または同じマニュアルの別の部分では8 MiB)を意味します。そのため、これらのファイルをまとめてtarすることで利点を得られません。-9を使用すると、decompessor(および辞書)が64 MiBになり、それがあなたの望んだものだと思います。

編集

別の可能性は、別のコンプレッサーを使用することです。7zipを使用しますが、最初にこれらのファイルをtarし、次に7zipをtarします。

ファイルの内容に応じて、おそらくPPM-D方式で7zipを使用できます(LZMAまたはLZMA2の代わりに、これがデフォルトであり、xzで使用されるものと同じです)。

良くない:Zip(dict = 32kB)、Bzip(dict = 900 kB)。


Xzと7-ZipはどちらもLZMA2を使用しているため、メリットはありません。PPMDは、すでに圧縮されたメディア(MP3やビデオなど)からの非常に遅いが高い圧縮率のエントロピー抽出のために最適化されています。2つのファイル間の大きな類似性を見つけて辞書に保存することは特にありそうにありません-LZMA2よりもそうではありません。
allquixotic

woliveirajr、ない使用について何-1-9設定が、指定しdict=64MBたりdict=128MB、設定mode=fast
osgx 14年

-1または-9の代わりにdict = xxMBを使用すると、ポイントに直接行きますが、-9を使用するだけでxzが他のパラメーターを設定する方法がわからないので、何かを見逃さないかどうかわかりませんそうしないと。あなたは正しい方向に向かっていると思います。テストするだけで正確な答えが得られます。
woliveirajr 14年

3
xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G私は、18メガバイトのtar.xzアーカイブに250個のファイル(7.5ギガバイト)を圧縮することができました。
osgx 14年

@osgx :)それはかなりいいです。時間がかかりすぎなかった場合(つまり、ニーズの範囲内であった場合)、問題は解決しました!:)それで、final_size = 13MB + x * 6kBになりました。
woliveirajr 14年

9

あなたが言うようにそれらが本当に99%類似している場合、bsdiffまたは類似のアルゴリズムを使用してファイル間の差分を計算できるはずです。違いは累積的ですか(つまり、各ファイルは最初のファイルと少し異なります)、または2つのファイルの違いはほとんど同じですか?

累積的でない場合は、次のことができるはずです。

  • 任意のファイルを「ベースライン」として取得します
  • bsdiffベースラインファイルと各追加ファイルの比較を実行します
  • 各diffを個別のファイルとして、ベースラインファイルと共に保存します
  • xz結果全体(ベースライン+差分)でコンプレッサーを実行します。

結果はxz、アーカイブ全体を作成するよりもはるかに小さくなります。

次に、ベースラインの上に差分を「適用」することで元のファイルを「再構成」し、他の各ファイルを取り出します。


累積的ではありません。( "ファイルのすべてのペアに同じデータが99%ある...")
osgx 14年

1
差が累積的でない場合、これはbsdiffアルゴリズムの適切なアプリケーションです。試してみる。
allquixotic

答えてくれてありがとう、しかし私はすでにxz:でタスクを実行しtar c directory|xz --lzma2=dict=128M,mode=fast、入力ファイルを削除しました。実際、私の入力ファイルはテキストだったので、bsdiff(PCにインストールされていない)の代わりにdiffを使用することもできます。
osgx 14年

5

あなた(I)は、例えばrziplrzipReadme)など、長距離パターン検出が可能なアーカイバでtarを使用できます。両方とも長距離冗長性検出/重複排除を使用し、rzipはbzip2を使用し、lrzipはxz(lzma)/ ZPAQを使用します。

rzipは、gzipまたはbzip2と機能が似ている圧縮プログラムですが、ファイルの長距離冗長性を利用できるため、rzipが他のプログラムよりもはるかに優れた圧縮率を生成できる場合があります。... rzipの主な利点は、900 Mバイトの有効な履歴バッファがあることです。これは、他の一般的に使用される圧縮プログラムと比較して、非常に長い距離にわたって入力ファイルの一致する部分を見つけることができることを意味します。比較すると、gzipプログラムは32 kバイトの履歴バッファーを使用し、bzip2は900 kバイトの履歴バッファーを使用します

lrzipはより大きなバッファを持ち、重複排除後に多くの圧縮アルゴリズム(非常に高速、高速、良好、そして最高のZPAQの1つ)を使用する場合があります。

Lrzipは、最初のパスで長距離冗長性を削減するrzipの拡張バージョンを使用します。lrzipの変更により、メモリサイズに応じてスケーリングされます。

データは次のいずれかです。1. bzip2圧縮の約2倍の速度で優れた圧縮を提供するlzma(デフォルト)による圧縮...

他の方法が使用されるBUP -ブロック- /セグメント・レベルの重複排除とバックアッププログラム、Gitのパックファイルに基づきました:

ローリングチェックサムアルゴリズム(rsyncと同様)を使用して、大きなファイルをチャンクに分割します。

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