Compression/Decompression,什么使编解码器可拆分?

Compression/Decompression, what make a codec splittable?

由于缺乏压缩知识,我无法清楚地了解所谓的 'splittable' 编解码器。例如,gzip 与 bzip2,我确实看到当 运行 MapReduce 针对 ~400M gzip 文件时,它只会启动一个映射器,而对于 bzip2,它会启动 4 个映射器。

导致 gzip 不可拆分的根本问题是什么?我听说 gzip 不可拆分,因为它将 'metadata' 存储在文件头中,而 bzip2 为每个块存储 'metadata'。

如果这是阻止 gzip 可拆分的唯一问题,为什么不简单地让所有 gzip 解压缩器线程先去文件头获取 'metadata',然后每个线程负责压缩的一部分文件?

另一个问题,对于 bzip2,它将文件分成多个块。一条记录(以文本文件为例,一行)是否有可能被分成两部分并放在两个不同的块中? bzip2创建块时是否关心记录的完整性?

非常感谢!

bzip2 流由一系列独立的可解压缩块组成,其中每个块都以固定的 48 位序列开头:0x314159265359。 (这个数字可能看起来很熟悉。)这允许简单地搜索该序列并在那里开始解压缩。

误报的可能性很小,因为没有什么能阻止该序列出现在块中的压缩数据中。

gzip 流通常没有可以开始解压缩的断点,也没有这些点的任何标记。这是一个很长的依赖流。

但是,如果需要,可以使用断点和标记构建 gzip 流。 pigz 有一个 -i--independent 选项,它使块可以独立解压缩,压缩率的成本很小。使用 -b--blocksize 选择未压缩的块大小,默认值为 128K。每个块之间是可以搜索的字节00 00 ff ff 00 00 00 ff ff。由于它是 72 位,因此误报的概率比搜索 48 位标识符低得多。