【问题标题】:How do the different compression levels of gzip differ?gzip 的不同压缩级别有何不同?
【发布时间】:2017-07-04 01:13:01
【问题描述】:

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

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

例如,在分配霍夫曼代码时,级别会产生任何差异吗?

【问题讨论】:

    标签: zip compression gzip zlib


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我是否认为如果重复的字符串倾向于出现在更远的位置(但在同一个块内),则需要更多的内存来存储更大的距离?例如,假设文件中的(总)重复程度相同,重复字符串平均出现 50 个字节会比重复字符串平均出现 500 个字节产生更好的压缩率?还是为距离分配的内存是固定的?
    • 更远的距离需要更多的位。 50 的距离需要 4 位加上一个霍夫曼码(至少一位),而 500 的距离需要 7 位加上一个霍夫曼码。霍夫曼码的大小将取决于这些 bin 与其他 bin 相比显示为距离的频率。
    【解决方案2】:

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

    原因是当您拥有如此大的缓冲区时,霍夫曼表将包含所有可能产生最佳结果的字节。当算法用完缓冲区空间时,它需要重置它的表(在流中为此添加了一个代码),这意味着你从头开始一个新的编码表,这意味着你会丢失字节来重新设计那个新表...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-11
      • 2012-09-19
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 2015-07-21
      • 2015-07-14
      相关资源
      最近更新 更多