GNU/Linux >> Linux の 問題 >  >> Linux

Gzip 圧縮がデータの重複チャンクを排除しないのはなぜですか?

ニコール・ハミルトンは gzip を正しく指摘しています 辞書のサイズが小さいため、遠い重複データを見つけることはできません。

bzip2 メモリが 900 KB に制限されているため、同様です。

代わりに、以下を試してください:

LZMA/LZMA2 アルゴリズム (xz7z )

LZMA アルゴリズムは Deflate と同じファミリに属しますが、はるかに大きな辞書サイズを使用します (カスタマイズ可能。デフォルトは 384 MB 程度です)。 xz 最近の Linux ディストリビューションにデフォルトでインストールされるはずのユーティリティは、gzip に似ています。 LZMA を使用します。

LZMA は長距離の冗長性を検出するため、ここでデータを重複排除できます。ただし、Gzip よりも低速です。

別のオプションは 7-zip (7zp7zip これは、デフォルトで LZMA を使用するアーカイバ (シングルストリーム圧縮ではなく) です (LZMA の作成者によって作成されました)。 7-zip アーカイバは、.7z にアーカイブするときに、ファイル レベルで (同じ拡張子のファイルを調べて) 独自の重複排除を実行します。 フォーマット。これは、 tar を置き換えたい場合に、 7z で 、重複排除された同一のファイルを取得します。ただし、7z はナノ秒のタイムスタンプ、権限、または xattrs を保持しないため、ニーズに合わない可能性があります。

lrzip

lrzip Gzip/Deflate、bzip2、lzop、または LZMA などの従来のアルゴリズムにデータを供給する前に、データを前処理して長距離冗長性を除去する圧縮プログラムです。ここで提供するサンプル データについては、必須ではありません。入力データがメモリに収まりきらないほど大きい場合に便利です。

この種のデータ (重複した非圧縮チャンク) には、 lzop を使用する必要があります lrzip による圧縮 (非常に高速) 、重複排除されたデータを完全にランダムに圧縮しようとしても、何のメリットもありません。

バップとオブナム

質問のバックアップにタグを付けたので、ここでの目標がデータのバックアップである場合は、Bup や Obnam などの重複排除バックアップ プログラムの使用を検討してください。


gzip gzip は、LZ77 とハフマン コーディングを組み合わせた DEFLATE アルゴリズムに基づいています。これは、オンザフライで構築された辞書を使用して重複を監視し、入力ストリームを圧縮シンボルに変換することによって機能するロスレス データ圧縮アルゴリズムです。ただし、32K を超えて区切られた重複を見つけることはできません。 1MB 離れた重複を見つけることを期待するのは現実的ではありません。


gzip xz であっても、重複は検出されません 巨大な辞書サイズではそうではありません。あなたができることは mksquashfs を使うことです - これにより、重複のスペースが節約されます。

xz での簡単なテスト結果 と mksquashfs 3 つのランダムなバイナリ ファイル (64MB) のうち 2 つが同じ:

セットアップ:

mkdir test
cd test
dd if=/dev/urandom of=test1.bin count=64k bs=1k
dd if=/dev/urandom of=test2.bin count=64k bs=1k
cp test{2,3}.bin
cd ..

スカッシュ:

mksquashfs test/ test.squash
> test.squash - 129M

xz:

XZ_OPT='-v --memlimit-compress=6G --memlimit-decompress=512M --lzma2=preset=9e,dict=512M --extreme -T4 ' tar -cJvf test.tar.xz test/
> test.tar.xz - 193M

Linux
  1. sed の正規表現で `\d` が機能しないのはなぜですか?

  2. 通常のデータ CD のように CD Audio を dd できないのはなぜですか?

  3. データ ディレクトリの再配置後に mysql が起動しない

  1. データが重要である理由とその保護方法

  2. なぜgdbはエイリアスを好まないのですか

  3. innodb_file_per_table を使用する理由

  1. STDIN からデータを読み取りながらファイルを圧縮する

  2. xargs -L では正しいフォーマットが生成されるのに、xargs -n では生成されないのはなぜですか?

  3. Bash `(())` が `[[]]` 内で動作しないのはなぜですか?