如果我运行
dd if=/dev/zero bs=8192 count=1000000 | gzip --best >test.gz
我的输出文件大小为7950131字节。因此,压缩比约为1/1000。然而,我预计gzip使用的是游程编码+哈夫曼编码,因此应该至少实现1/100000的压缩比。为什么它在全零文件上没有更好的压缩效果?
如果我运行
dd if=/dev/zero bs=8192 count=1000000 | gzip --best >test.gz
我的输出文件大小为7950131字节。因此,压缩比约为1/1000。然而,我预计gzip使用的是游程编码+哈夫曼编码,因此应该至少实现1/100000的压缩比。为什么它在全零文件上没有更好的压缩效果?
Deflate格式的最大压缩比为1032:1。这是因为可以编码的最长序列长度为258字节。每个这样的序列都需要至少两位(一个用于长度代码,一个用于距离代码),因此每个压缩字节可以编码4 * 258 = 1032个未压缩字节。
通过对gzip结果进行gzip处理,可以获得更高的压缩率。通常情况下,这并不会提高压缩率,但对于非常长的序列来说,它可能会有所帮助。
顺便说一下,deflate使用的LZ77方法比行程长度编码更通用。它不仅可以表示长度,还可以表示长度/距离对。这允许从一些距离后复制字符串,或者像行程长度那样在距离为一时复制字节,或者在距离为三时复制三字节等。