零值的gzip压缩比率

10

如果我运行

dd if=/dev/zero bs=8192 count=1000000 | gzip --best >test.gz

我的输出文件大小为7950131字节。因此,压缩比约为1/1000。然而,我预计gzip使用的是游程编码+哈夫曼编码,因此应该至少实现1/100000的压缩比。为什么它在全零文件上没有更好的压缩效果?


bzip2 对于长时间的零值连续出现非常有效。 - shuckc
1个回答

18

Deflate格式的最大压缩比为1032:1。这是因为可以编码的最长序列长度为258字节。每个这样的序列都需要至少两位(一个用于长度代码,一个用于距离代码),因此每个压缩字节可以编码4 * 258 = 1032个未压缩字节。

通过对gzip结果进行gzip处理,可以获得更高的压缩率。通常情况下,这并不会提高压缩率,但对于非常长的序列来说,它可能会有所帮助。

顺便说一下,deflate使用的LZ77方法比行程长度编码更通用。它不仅可以表示长度,还可以表示长度/距离对。这允许从一些距离后复制字符串,或者像行程长度那样在距离为一时复制字节,或者在距离为三时复制三字节等。


1
啊哈,这解释了很多问题。特别是为什么比率如此接近1032。非常感谢您提供的见解。 - Udo Klein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接