【发布时间】:2017-07-04 01:13:01
【问题描述】:
我试图更好地了解 gzip 的不同压缩级别 (1-9) 在实现编码的方式上有何不同。
我查看了 zlib C 源代码,似乎它与搜索最长匹配字符串的详尽程度有关,但要寻找更具体的信息。
例如,在分配霍夫曼代码时,级别会产生任何差异吗?
【问题讨论】:
标签: zip compression gzip zlib
我试图更好地了解 gzip 的不同压缩级别 (1-9) 在实现编码的方式上有何不同。
我查看了 zlib C 源代码,似乎它与搜索最长匹配字符串的详尽程度有关,但要寻找更具体的信息。
例如,在分配霍夫曼代码时,级别会产生任何差异吗?
【问题讨论】:
标签: zip compression gzip zlib
正如您所观察到的,级别的不同仅在于 deflate 查找匹配字符串的难度。霍夫曼编码是在选定的固定数量的符号(文字和长度/距离对)上完成的,产生一个“块”,其中该数字由内存级别定义,而不是压缩级别。生成的霍夫曼码必然不同,因为被编码的符号会有所不同。
内存级别的选择对压缩也有一些影响,因为更多的符号将块的代码描述成本分散到更多的符号上,但是太多的符号可能会阻止霍夫曼代码适应局部变化符号的统计。默认内存级别为 8(导致每块 16,383 个符号),因为测试表明这比 9 级(每块 32,767 个符号)提供了更好的压缩。但是您的里程可能会有所不同。
【讨论】:
据我回忆,是的,这主要取决于您要分配的缓冲区的大小。缓冲区越大,压缩效果越好。如果您可以分配一个大小约为 input file size × 1.2 的缓冲区,那么在大多数情况下,您将使用 Huffman 获得最佳压缩效果。
原因是当您拥有如此大的缓冲区时,霍夫曼表将包含所有可能产生最佳结果的字节。当算法用完缓冲区空间时,它需要重置它的表(在流中为此添加了一个代码),这意味着你从头开始一个新的编码表,这意味着你会丢失字节来重新设计那个新表...
虽然在某些情况下重置可能是有益的(即在文件的前半部分设置为值 X 的许多字节,然后在后半部分设置为值 Y 的更多字节),但这种情况很少发生。
【讨论】: