![gzip 的最大压缩率是多少?](https://linux22.com/image/1238494/gzip%20%E7%9A%84%E6%9C%80%E5%A4%A7%E5%8E%8B%E7%BC%A9%E7%8E%87%E6%98%AF%E5%A4%9A%E5%B0%91%EF%BC%9F.png)
gzip 最大可以解压缩到多少(为了举例,假设为 10kb)?
答案1
更新 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 的压缩率。
您可以使用 - 检查解压 gzip 文件会产生多少数据,而无需将其未压缩的内容实际写入磁盘。gunzip -c file.gz | wc --bytes
这将解压文件但不存储结果,而是将它们传递给 ,它会在传递时计算字节数,然后丢弃它们。如果压缩内容是包含许多小文件的 tar 文件,您可能会发现解压整个存档需要更多磁盘空间,但在大多数情况下,通过管道输出wc
返回的计数将与您需要的一样准确。gunzip
wc
答案2
逐字引用自https://stackoverflow.com/a/16794960/293815
deflate 格式的最大压缩比为 1032:1。这是因为可以编码的最长运行为 258 个字节。每个这样的运行至少需要两位(一位用于长度代码,一位用于距离代码),因此每个压缩字节可以编码 4*258 = 1032 个未压缩字节。
您可以通过对 gzip 的结果进行 gzip 压缩来获得更高的压缩率。通常这不会提高压缩率,但对于非常长的运行来说,它可以。
顺便说一句,deflate 使用的 LZ77 方法比游程编码更通用。它使用的不是长度,而是长度/距离对。这允许从某个距离向后复制一个字符串,或者以游程长度复制一个字节,距离为 1,或者复制三个字节,距离为 3,等等。
答案3
通常压缩率不会超过 95%(因此 10kB 的 gzip 数据解压后会变成 ~200kB),但有些特制文件会以指数方式膨胀。看看42.zip
,它会解压成几 PB 的(毫无意义的)数据。
答案4
文件中有 10 MB 的零,使用 gzip -9 压缩到 10217。因此最大比率看起来大约为 1000x。