【问题标题】:gzip compression ratio for zeros零的gzip压缩比
【发布时间】:2024-01-22 16:52:01
【问题描述】:

如果我跑了

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

我得到一个 7950131 字节的输出文件。所以压缩比约为 1/1000。但是我希望 gzip 使用运行长度编码 + 霍夫曼代码,因此至少可以达到 1/100000。为什么它对全零文件没有更好的压缩效果?

【问题讨论】:

  • bzip2 非常适合长时间运行的零

标签: compression gzip


【解决方案1】:

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

您可以通过对 gzip 的结果进行 gzip 压缩来获得更多压缩。通常这不会提高压缩率,但在很长一段时间内它可以。

顺便说一句,deflate 使用的 LZ77 方法比游程编码更通用。不仅使用长度,还使用长度/距离对。这允许从一段距离向后复制一个字符串,或者复制一个字节作为运行长度的距离为一,或者复制三个字节的距离为三,等等。

【讨论】:

  • 啊哈,这解释了很多。尤其是为什么这个比率如此接近 1032。非常感谢您的洞察力。