【问题标题】:Which deflate (zip) algorithm characteristics can cause a 50% compression factor on the recompression of certain data?哪些 deflate (zip) 算法特性可以在重新压缩某些数据时导致 50% 的压缩系数?
【发布时间】:2021-01-21 03:27:38
【问题描述】:

众所周知,重新压缩(压缩压缩数据集)通常会产生非常低(或没有)的压缩。

因此,我非常惊讶地发现第二次 ZIP 重新压缩产生大约 50% 压缩系数的数据集(通过两次运行 Unix zip 工具进行测试,最大压缩系数 (9)) .

因此,我很好奇:Deflate 算法的哪些特征(限制)会导致这种行为?我尝试过其他程序,例如,像 zstd 这样的算法在第一次通过时会产生更好的压缩。

供参考,数据集为here

【问题讨论】:

    标签: zip compression deflate lossless-compression


    【解决方案1】:

    Deflate 的匹配长度限制为 258 个字节。如果经常有比这更长的重复字符串,那么第二次压缩可能会产生结果。 zstd 代码匹配长度高达 128K 字节。

    gzip -9 一次在您的数据上给出 36340381 字节。 gzip -9 两次对您的数据给出 18860632 字节。 zstd -9 一次给出 18985681 个字节。第二个 zstd -9 仅略微减少到 18882745 字节。

    【讨论】:

    • 如果我使用 Info-Zip 的 LZ77 进行 Deflate(长度限制为 258,距离限制 ~32KiB)并通过 LZMA 的“MA”部分的简单实现进一步编码,我得到 20464328 字节的 Zip文件。也许 258 字节的匹配长度限制并不能解释此数据的所有内容。
    • 258 字节限制解释了有限的第一次压缩。然后如何再次压缩压缩数据是完全不同的事情,因为生成的重复模式处于流中的位级别。
    • 实际上,该示例的显着方面是第一次压缩的重复压缩块是 8 位对齐的,并且可以进一步显着压缩。
    • 每个重复不必是 8 位对齐的,因为非 8 位对齐的重复的八个副本是 8 位对齐的。例如。如果每次重复是 7 位,则其中八个将是 7 个字节。有了足够的它们,这七个字节会重复,然后就可以压缩了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多