tarring 文件可以提高压缩率吗?

Pra*_*tic 9 tar compression

使用标准工具(例如 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 的模式。但请注意执行压缩(和解压缩)需要多少内存...