ファイルをtarすることで圧縮を改善できますか?


9

一連のファイルをまとめてtarで圧縮すると、標準ツール(gzip、bzip2、xzなど)で圧縮を改善できますか?

私は長い間これが事実であると思っていましたが、それを試したことはありません。ランダムなバイトの同じ20Mbファイルの2つのコピーが一緒にtarされている場合、これを実現する巧妙な圧縮プログラムは、tarball全体をほぼ20Mbに圧縮できる可能性があります。

私は、gzip、bzip2、およびxzを使用して、1)ランダムバイトのファイル、2)そのファイルの2つのコピーのtarball、および3)そのファイルの2つのコピーの猫を使用して、この実験を試しました。すべての場合において、圧縮によってファイルサイズが縮小されることはありませんでした。これはケース1で予想されますが、ケース2および3の場合、最適な結果は、40Mbファイルを約20Mbに縮小できることです。これは、特に冗長性が離れているため、圧縮プログラムにとっては難しい洞察です。完璧な結果を期待することはできませんが、ある程度の圧縮があるとは思っていました。

テスト:

dd if=/dev/urandom of=random1.txt bs=1M count=20
cp random1.txt random2.txt
cat random1.txt random2.txt > random_cat.txt
tar -cf randoms.tar random1.txt random2.txt
gzip -k random* &
bzip2 -k random* &
xz -k random* &
wait
du -sh random*

結果:

20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.40937 s, 14.9 MB/s
[1]   Done                    gzip -k random*
[2]-  Done                    bzip2 -k random*
[3]+  Done                    xz -k random*
20M random1.txt
21M random1.txt.bz2
21M random1.txt.gz
21M random1.txt.xz
20M random2.txt
21M random2.txt.bz2
21M random2.txt.gz
21M random2.txt.xz
40M random_cat.txt
41M random_cat.txt.bz2
41M random_cat.txt.gz
41M random_cat.txt.xz
41M randoms.tar
41M randoms.tar.bz2
41M randoms.tar.gz
41M randoms.tar.xz

これは一般的に私が期待すべきことですか?

ここで圧縮を改善する方法はありますか?


あなたのテストケースは悪い例です。たとえば、約100(実際の)テキストファイルのディレクトリでテストを実行してみてください。
lcd047

なぜ悪い例ですか?私たちは何を期待すべきかを正確に知っています。ランダムファイルは圧縮できず、ランダムファイルの2つは半分に圧縮できます。
Praxeolitic

「ランダム」ファイルの内容に問題があります。それらは非圧縮性です。より良いアイデアを得るために、2つの異なる大きなテキストファイルを使用します。ここでの関連アイデアは、「正規化された圧縮の差」です。あなたはを見てかかることがありますims.cuhk.edu.hk/~cis/2005.4/01.pdfあなたは、テストのこの種をやって遭遇する可能性のある問題の種類を確認するために。
Bruce Ediger 2015年

回答:


11

あなたはコンプレッサーの「ブロックサイズ」に反対しています。ほとんどの圧縮プログラムは入力をブロックに分割し、各ブロックを圧縮します。bzipブロックサイズは最大で900Kになるため、繰り返しに900Kバイトを超えるパターンは表示されません。

http://www.bzip.org/1.0.3/html/memory-management.html

gzipは32Kブロックを使用しているようです。

xzを使えば運がいいです!manページから:

   Preset   DictSize   CompCPU   CompMem   DecMem
     -0     256 KiB       0        3 MiB    1 MiB
     -1       1 MiB       1        9 MiB    2 MiB
     -2       2 MiB       2       17 MiB    3 MiB
     -3       4 MiB       3       32 MiB    5 MiB
     -4       4 MiB       4       48 MiB    5 MiB
     -5       8 MiB       5       94 MiB    9 MiB
     -6       8 MiB       6       94 MiB    9 MiB
     -7      16 MiB       6      186 MiB   17 MiB
     -8      32 MiB       6      370 MiB   33 MiB
     -9      64 MiB       6      674 MiB   65 MiB

したがって、「xz -8」は最大32MBのパターンを検出し、「xz -9」は最大64MBのパターンを検出します。ただし、圧縮の実行(および解凍)に必要なRAMの量に注意してください...


1
はい、xz -8はテストでtarballとcatを21Mに縮小します。
Praxeolitic

1
ブロックサイズだけではありません。しかし、完全な話はSEのいくつかの段落で説明できるものではありません。
lcd047

1
@Praxeoliticデータ圧縮のコースが役立つかもしれません。
lcd047

1
@ lcd047圧縮は大きなトピックですが、ここでの質問は単に「なぜこの圧縮を行わなかったのか」でした。答えは、圧縮が繰り返しパターンで機能し、検索したいパターンが他のツールが探していたよりも再発に時間がかかるためです。
データレス、2015年

1
また、ほとんどのコマンドラインコンプレッサーで「-9」が「パターンを見つけにくくする」ことを意味するのではなく、「より大きなパターンスペースを考慮する」ことを意味することも知っています。
データなし2015年

2

ランダムに選択したファイルの内容が良い例ではありません-圧縮されたtarファイルは次のようになります大きなオリジナルより。すでに圧縮されている形式(たとえば、多くの画像/オーディオ/ビデオ形式)のファイルでも同じことがわかります。

ただし、圧縮可能なコンテンツを持つ複数のファイルをtarで圧縮すると、通常、それらを個別にtarで圧縮する場合よりも、tarfileの合計サイズは小さくなります。特に、内容が類似している場合(たとえば、同じプログラムのログファイル)。その理由は、ファイルごとの圧縮オフセットデータの一部(一部の圧縮アルゴリズムのパターン配列など)は、同じtarfile内のすべてのファイルで共有できるためです。



@kosこれは、使用されるアルゴリズムとデータに依存します。引用されている33%は非常に特殊なケースです。gzipとbzip2を使用して、ランダムに生成された1000個の1MBファイルを測定したところ、すべてのファイルで1%未満の増加でした。
jofel

2

すでに示したように:

  1. ランダムファイルはすでに最大の「情報エントロピー」を含んでいるため、圧縮しないため、ランダムファイルの使用は適切ではありません。
  2. 公平に比較​​するには、多くのファイルをパックする必要あります。

より良いテストケースはこれかもしれません:

cd /var/tmp
tar -zcf test1.tar /usr
tar -cf test2.tar /usr
gzip test2.tar
ls -h

(注:下にマウントがないことを願っています/usr!)

tar -jcf代わりにxz圧縮に使用できます。

今ならばtest2.tar.gztest1.tar.gzよりも小さい、テストは(すなわちターリングファイルは、その後、圧縮後、圧縮ターリングよりも優れている)成功しています。私の推測では、多くの(つまり、何千もの)ファイルがそうなるでしょう。欠点は、最初にtarファイル全体をビルドしてから圧縮する必要があるため、実行に時間がかかる可能性があり、さらに多くのディスク領域が必要になることです。そのため、代わりに1番目の方法がよく使用されます。1つ目の方法は、ファイルをその場で圧縮するためです。ただし、tarballが小さくない場合もあります。

たとえば、オフサイトバックアップでは通常、合計2TBの4,000,000ファイルをバックアップします。したがって、最初の方法ははるかに速く、追加の2TBのディスクを必要としません。


アーカイブ(つまりtar)を-z圧縮しませんか?通常、これを強調するために.tar.gz で終わる出力ファイル名。czf
JariKeinänen、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.