ファイルを圧縮すると圧縮率が向上しますか?

ファイルを圧縮すると圧縮率が向上しますか?

標準ツール(gzip、bzip2、xzなど)を使用して複数のファイルを一緒に圧縮すると、圧縮が向上する可能性がありますか?

私はいつもこれが本当だと仮定しましたが、テストしたことはありません。同じ20Mbファイルの2つのコピーをランダムバイトにまとめて圧縮することで、巧妙な圧縮プログラムがそれを実現し、タールボール全体をほぼ20Mbに圧縮できます。

gzip、bzip2、xzを使って1)ランダムバイトファイル、2)2つのファイルコピーのtarball、3)2つのファイルコピーのcatを圧縮しました。すべての場合において、圧縮によってファイルサイズが縮小されるわけではありません。ケース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

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

圧縮率を上げる方法はありますか?

ベストアンサー1

コンプレッサーの「ブロックサイズ」に直面します。ほとんどのコンプレッサーは入力をチャンクに分割し、各チャンクを圧縮します。 bzipブロックサイズは最大900Kに制限されているため、繰り返しに900Kバイト以上を必要とするパターンは表示されません。

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

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

xzと一緒なら運が続く!マニュアルページから:

   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のパターンを探します。ただし、圧縮(および解凍)を実行するために必要なメモリ量を知っている必要があります。

おすすめ記事