2010-05-09 11:47:14 +0000 2010-05-09 11:47:14 +0000
53
53

gzip的最大压缩比是多少?

一个gzip(举个例子,比如说10kb)可以解压到最大的大小是多少?

答案 (7)

95
95
95
2010-05-09 13:11:52 +0000

更新2020-02-06:如评论中所述,我无法用gzip重现原始结果。假设我在最初的快速测试中不小心使用了不同的压缩格式,我已经用gzip重复了一次,并相应地更新了下面的数据。这个新的结果与其他答案/评论中所说的理论最大压缩量一致。


这在很大程度上取决于被压缩的数据。使用标准版本的gzip(使用默认选项或指定-9)对一个满是零的1Gb文件进行快速测试,得到的压缩大小是~1018Kb,所以你的10Kb文件有可能扩展成~10Mbytes。

如果数据的冗余度较低,例如,归档文件中包含的图像文件是原生压缩的格式(gif, jpg, png, …),那么gzip可能根本不会进一步压缩。对于像程序可执行文件这样的二进制文件,你可能会看到高达2:1的压缩,对于纯文本、HTML或其他标记,3:1或4:1或更多并不是不可能的。在某些情况下,你可能会看到10:1,但在一个充满单一符号的文件中看到的~1030:1是你在类似的人为环境之外不会看到的。

你可以用gunzip -c file.gz | wc --bytes检查解压一个gzip文件会产生多少数据,而不实际将其未压缩的内容写入磁盘–这将解压文件,但不存储结果,而是将其传递给wc,后者将在传递时计算字节数,然后丢弃它们。如果压缩的内容是一个包含很多很多小文件的tar文件,你可能会发现解压完整的存档需要明显更多的磁盘空间,但在大多数情况下,通过gunzip输出的管道返回的计数将是你所需要的精确度。

10
10
10
2010-05-09 12:04:29 +0000

通常你不会得到超过95%的压缩率(所以10kB的gzipped数据会解压到约200kB),但有一些特别制作的文件会成倍地扩展。寻找42.zip,它可以解压到几PB的(无意义的)数据。

8
8
8
2017-05-11 14:16:39 +0000

逐字引自https://stackoverflow.com/a/16794960/293815

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

你可以通过对gzip的结果进行gzipping来获得更多的压缩。通常这并不能提高压缩率,但对于非常长的运行来说,它可以。

顺便说一下,deflate使用的LZ77方法比运行长度编码更通用。不仅仅是一个长度,而是使用一个长度/距离对。这样就可以把一个字符串从某个距离复制回来,或者像run-length中复制一个距离为1的字节,或者复制距离为3的三倍字节等等。

6
6
6
2010-05-09 12:03:51 +0000

任何压缩算法的压缩比都将是被压缩数据的函数(除了该数据的长度)。

这里是在 MaximumCompression , 看其中一个样本,比如, 多文件压缩基准测试总结

File type : Multiple file types (46 in total) # of files to compress in this test : 510 Total File Size (bytes) : 316.355.757 Average File Size (bytes) : 620,305 Largest File (bytes) : 18,403,071 Smallest File (bytes) : 3,554
```。
4
4
4
2010-05-09 12:44:19 +0000

一个巨大的文件只包含一个符号就可以很好的压缩。

4
4
4
2013-04-07 13:12:41 +0000

文件中有10MB的零,用gzip-9压缩到10217。所以最大比例看起来是1000倍左右。

1
1
1
2016-10-17 02:32:42 +0000

你的问题的答案,取决于输入。为了让你了解压缩是如何完成的,请看这个六分钟的视频。 https://www.youtube.com/watch?v=ZdooBTdW5bM

你应该从中得到的是,压缩率取决于每个字符的频率,因此没有通用的最大压缩率,它取决于输入,对于英文文本,它是大约65%。