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