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

问题描述:

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

我看了zlib的C源代码和它似乎具有最长匹配的字符串搜索如何详尽的是做,但寻找更具体的信息。

例如,不要水平的产量为霍夫曼码分配什么不同吗?

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

存储器级别的选择对压缩也有一定的影响,因为大量的符号将块的代码描述的代价扩展到更多的符号上,但是过多的符号可能会阻止霍夫曼代码适应局部变化在符号的统计中。默认的存储器级别是8(每个块产生16,383个符号),因为测试表明这提供比级别9更好的压缩(每块32,767个符号)。但是你的里程可能会有所不同

+0

谢谢!我是否正确地认为,如果重复的字符串往往会发生在更远的位置(但在同一个区块内),则需要更多的内存来存储更大的距离?例如,假设文件中具有相同程度的(全部)重复,具有重复字符串的平均50个字节的返回将产生稍微好于比平均500字节上出现重复的字符串更好的压缩比率?还是分配给距离固定的内存? – glupyan

+0

更远的距离需要更多位。 50的距离需要4位加霍夫曼码(至少一位),而500的距离需要7位加霍夫曼码。霍夫曼编码的大小将取决于这些分箱与其他分箱相比多久显示为距离。 –

从我记得,是的,它主要是基于你会被分配缓冲区的大小。缓冲区越大,可以压缩得越好。如果您可以分配大小约为input file size × 1.2的缓冲区,那么在大多数情况下,您将获得霍夫曼可能的最佳压缩。

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

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