【问题标题】:What compression/archive formats support inter-file compression?哪些压缩/归档格式支持文件间压缩?
【发布时间】:2026-01-24 18:10:01
【问题描述】:

This question on archiving PDF's 让我想知道——如果我想压缩(出于存档目的)大量文件,这些文件本质上是在主模板(信笺抬头)之上进行的小改动,似乎可以获得巨大的压缩收益文件间压缩。

是否有任何标准压缩/归档格式支持此功能? AFAIK,所有流行的格式都专注于压缩每个文件。

【问题讨论】:

    标签: compression archive


    【解决方案1】:

    多种格式进行文件间压缩。

    最古老的例子是 .tar.gz; .tar 没有压缩,但将所有文件连接在一起,每个文件前面都有标题,而 .gz 只能压缩一个文件。两者都是按顺序应用的,它是 Unix 世界的传统格式。 .tar.bz2 是一样的,只是用 bzip2 代替 gzip。

    最近的示例是具有可选“实体”压缩的格式(例如 RAR 和 7-Zip),如果通过命令行标志或 GUI 选项启用,它们可以在压缩之前在内部连接所有文件。

    【讨论】:

    • 谢谢 - 我不知道“固体压缩”这个词。这有帮助!
    • 另一个有趣的,但不是很受欢迎,所以有点超出了原始问题:rzip。
    • 在 .tar.gz 之前有 .tar.Z,但现在不再使用(完全被 .tar.gz 取代)。
    【解决方案2】:

    看看 google 的 open-vcdiff。

    http://code.google.com/p/open-vcdiff/

    它是为计算小的压缩增量而设计的,并实现了 RFC 3284。

    http://www.ietf.org/rfc/rfc3284.txt

    微软有一个 API 可以做类似的事情,没有任何标准。

    一般来说,您正在寻找的算法是基于 Bentley/McIlroy 的算法:

    http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.11.8470

    特别是如果模板的大小大于 gzip 使用的窗口大小 (~32k) 或 bzip2 使用的块大小 (100-900k),这些算法将是一个胜利。

    Google 在其 BIGTABLE 实现内部使用它们来存储压缩网页,原因与您寻找它们的原因大致相同。

    【讨论】:

      【解决方案3】:

      由于 LZW 压缩(它们几乎都使用)涉及构建一个重复字符表,例如您想要的架构,这将限制您必须一次解压缩整个存档。

      如果这在您的情况下是可以接受的,那么实现一种在压缩前将文件合并成一个大文件的方法可能会更简单。

      【讨论】:

      • 所以,基本上,“双压缩”(压缩一个 zip 文件)?
      • 不,原始 zip 文件由单独的压缩“blob”组成,第二遍找不到好的重复。
      • Toybuilder:实际上,'tar' 是通常的答案,因为它只是通过将文件与最小索引连接起来,从文件中生成一个大存档。这就是 .tar.gz 文件在 unix 世界中如此受欢迎的原因。