使用标准工具(例如 gzip、bzip2、xz)将一堆文件打包在一起是否可以提高压缩率?
我一直认为是这种情况,但从未测试过。如果我们将相同的 20Mb 随机字节文件的 2 个副本打包在一起,那么一个聪明的压缩程序可以将整个 tarball 压缩到几乎 20Mb。
我刚刚尝试使用 gzip、bzip2 和 xz 来压缩 1) 一个随机字节文件,2) 该文件的两个副本的 tarball,以及 3) 该文件的两个副本的猫。在所有情况下,压缩都不会减小文件大小。这是案例 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*
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
这通常是我应该期待的吗?
这里有没有办法改善压缩?
dat*_*ess 11
您遇到了压缩器的“块大小”。大多数压缩程序将输入分成块并压缩每个块。看起来 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
Run Code Online (Sandbox Code Playgroud)
所以 "xz -8" 最多可以找到 32MB 的模式,而 "xz -9" 最多可以找到 64MB 的模式。但请注意执行压缩(和解压缩)需要多少内存...
归档时间: |
|
查看次数: |
859 次 |
最近记录: |