压缩文件可以改善压缩率吗?


9

可以将一堆文件一起使用标准工具(例如gzip,bzip2,xz)改善压缩率吗?

我一直以为是这种情况,但从未对其进行过测试。如果我们将同一个20Mb文件的2个副本的随机字节放在一起,那么一个聪明的压缩程序将实现将整个tarball压缩到将近20Mb。

我刚刚尝试使用gzip,bzip2和xz压缩此实验,以压缩1)一个随机字节的文件,2)包含该文件两个副本的tarball,以及3)包含该文件两个副本的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

这通常是我应该期待的吗?

有没有办法改善压缩率?


您的测试用例是不好的例子。例如,尝试使用约100个(真实)文本文件的目录进行测试。
lcd047

为什么这是一个不好的例子?我们确切知道会发生什么。随机文件不能压缩,随机文件中的2个可以压缩一半。
Praxeolitic

“随机”文件内容有问题。它们是不可压缩的。使用两个不同的大文本文件可获得更好的主意。这里的一个相关想法是“归一化压缩差”。您可以查看ims.cuhk.edu.hk/~cis/2005.4/01.pdf,以查看进行此类测试时可能遇到的问题。
Bruce Ediger 2015年

Answers:


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

因此“ xz -8”最多可以找到32MB模式,“ xz -9”最多可以找到64MB模式。但是请注意执行压缩(和解压缩)需要多少内存...


1
是的,xz -8确实将测试中的压缩包和猫压缩到21M。
Praxeolitic 2015年

1
除了块大小以外,还有更多其他功能。但是完整的故事并不能在SE的几段中得到解释。
lcd047

1
@Praxeolitic数据压缩课程可能会有所帮助。
lcd047

1
@ lcd047压缩是一个巨大的话题,但是这里的问题只是“为什么不进行这种压缩”,答案是因为压缩是在重复模式上进行的,并且他想找到的模式比任何工具都需要更长的时间才能发生。
2015年

1
我也认为了解大多数命令行压缩器中的“ -9”并不意味着“努力寻找模式”,而是“考虑更大的模式空间”,这很有用。
2015年

2

随机选择了文件内容是不是一个很好的例子-压缩tarfiles将是更大的比原稿。对于已压缩格式的文件(例如,许多图像/音频/视频格式),您将看到相同的结果。

但是将具有可压缩内容的多个文件压缩在一起通常会产生比分别压缩它们时更小的总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.gz小于test1.tar.gz,则测试成功(即,先将文件先压缩然后压缩,再再压缩先压缩)。我的猜测是,它将存储大量(即数千个)文件。缺点是执行起来可能需要更长的时间,并且需要更多的磁盘空间,因为它必须先构建整个tar文件,然后再压缩它。这就是为什么通常使用第一种方法的原因,因为它可以动态压缩每个文件,即使它可能不会提供那么小的压缩包。

例如,在我们的异地备份中,我们通常备份4,000,000个文件,总计约2TB。因此,第一种方法要快得多,并且不需要额外的2TB磁盘。


-z压缩档案(即tar)吗?通常,输出文件名以czf.tar.gz结尾以强调这一点。
加里·凯纳嫩(JariKeinänen)2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.