web-dev-qa-db-ja.com

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

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

単一のファイルは30MBから13〜15 MBに圧縮できます(_xz -1_、_gz -1_、_bzip2 -1_を使用)が、2つ以上のファイルを圧縮する場合は、サイズ_13-15MB + N*0.3MB_ここで、Nはファイルの数です。

tar(堅実なアーカイブを作成するため)と_xz -6_(圧縮ディクショナリを1つのファイルよりも大きく定義するため--更新-これでは不十分です!)を使用する場合、私はまだサイズが_N*13MB_のアーカイブがあります。

gzipと_bzip2_はどちらも辞書が1 MB未満であり、私のtarストリームは30 MBごとに繰り返されるため、役に立たないと思います。

標準ツールを使用して、最新の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_よりも少し速くします。

19
osgx

あなたの詳細を考えると、あなたのファイルには実際に99%のデータが共通していて、連続した(またはほぼ連続した)1%の違いがあることを確認したと思います。

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

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

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

辞書のサイズ

私が入手できるあるドキュメントでは--- site -辞書のサイズはデコンプレッサのメモリ使用量とほぼ同じであると言われています。また、-1パラメータは1MiBのdictを意味し、-6は10 MiB(または同じマニュアルの別の部分では8 MiB)を意味します。そのため、これらのファイルを一緒にタール化してもメリットはありません。 -9を使用すると、デコンペッサ(および辞書)は64 MiBになり、それがあなたが望んでいたことだと思います。

編集

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

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

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

12
woliveirajr

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

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

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

結果は、アーカイブ全体を単にxzするよりもはるかに小さいはずです。

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

9
allquixotic

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

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

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

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

その場合、データは次のいずれかになります。1。bzip2圧縮の約2倍の速度で優れた圧縮を提供するlzma(デフォルト)によって圧縮されます。

もう1つの方法は、 bup を使用することです-git packfileに基づいて、ブロックレベル/セグメントレベルの重複排除を使用したバックアッププログラム:

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

5
osgx