更新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
输出的管道返回的计数将是你所需要的精确度。
逐字引自https://stackoverflow.com/a/16794960/293815
放缩格式的最大压缩比是1032:1。这是因为可以编码的最长运行是258个字节。每一个这样的运行至少需要两个比特(一个比特用于长度码,一个比特用于距离码),因此每一个压缩字节可以编码4/*258=1032个未压缩的字节。
你可以通过对gzip的结果进行gzipping来获得更多的压缩。通常这并不能提高压缩率,但对于非常长的运行来说,它可以。
顺便说一下,deflate使用的LZ77方法比运行长度编码更通用。不仅仅是一个长度,而是使用一个长度/距离对。这样就可以把一个字符串从某个距离复制回来,或者像run-length中复制一个距离为1的字节,或者复制距离为3的三倍字节等等。
任何压缩算法的压缩比都将是被压缩数据的函数(除了该数据的长度)。
这里是在 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
```。
你的问题的答案,取决于输入。为了让你了解压缩是如何完成的,请看这个六分钟的视频。 https://www.youtube.com/watch?v=ZdooBTdW5bM
你应该从中得到的是,压缩率取决于每个字符的频率,因此没有通用的最大压缩率,它取决于输入,对于英文文本,它是大约65%。