gzip的不同压缩级别有何不同?

时间:2017-07-04 01:13:01

标签: zip compression gzip zlib

我试图更好地理解gzip的不同压缩级别(1-9)在编码实现方式上有何不同。

我查看了zlib C源代码,看起来它与搜索最长匹配字符串的详尽程度有关,但需要查找更具体的信息。

例如,这些级别是否会产生霍夫曼代码分配的任何差异?

2 个答案:

答案 0 :(得分:0)

据我所知,是的,它主要取决于你要分配的缓冲区的大小。缓冲区越大,压缩效果越好。如果您可以分配大小约为input file size × 1.2的缓冲区,那么在大多数情况下,您将获得使用Huffman的最佳压缩。

原因是当你有这么大的缓冲区时,Huffman表将包含所有具有最佳结果的字节。当算法用完缓冲区空间时,它需要重置其表(为此添加的流中有一个代码),这意味着你从头开始一个新的编码表,这意味着你丢失了重新设计新表的字节数...

虽然有些情况下重置可能是有益的(即在文件的前半部分将多个字节设置为值X,然后在下半部分中有更多值为Y),但很少发生这种情况。 / p>

答案 1 :(得分:0)

正如您所观察到的,这些级别仅在于deflate查找匹配字符串的方式有所不同。霍夫曼编码是在选定的固定数量的符号(文字和长度/距离对)上完成的,产生一个"块",其中该数字由存储器级别而不是压缩级别定义。生成的霍夫曼代码必然不同,因为编码的符号会有所不同。

内存级别的选择也会对压缩产生一些影响,因为大量符号会将块的代码描述成本分散到更多符号上,但是太多符号可能会阻止霍夫曼代码适应本地更改符号的统计。默认内存级别为8(每个块产生16,383个符号),因为测试表明压缩比9级更好(每个块32,767个符号)。但是你的里程可能会有所不同。