linux - 如何使用多线程进行 zlib 压缩(相同输入源)

标签 linux multithreading compression zlib

我的目标是在并行线程中压缩同一源的数据。 我定义了列表中的作业,这些作业具有读取信息(每个作业 500kb-1MB)。

我的压缩器线程将使用 ZLIB 压缩每个 block 的数据并将其存储在相应作业的 outbuf 中。

现在,我想合并所有这些并创建一个标准 ZLIB 格式的输出文件。

从 ZLIB RFC 和浏览 pigzee 的源代码后,我了解到

ZLIB 头如下所示

     +---+---+
     |CMF|FLG| (2 bytes)
     +---+---+
     +---+---+---+---+
     |     DICTID    | (4 bytes. Present only when FLG.FDICT is set)
     +---+---+---+---+
     +=====================+
     |...compressed data...| (variable size of data)
     +=====================+
     +---+---+---+---+
     |     ADLER32   |  (4 bytes of variable data)
     +---+---+---+---+

在我的例子中,也没有字典。

所以当我组合两个压缩单元时,所有单元的标题都是相同的。

因此,我正在执行以下操作。

  1. 对于第一个单元,我正在编写 header +压缩数据。

  2. 对于第二个单元到最后一个单元,我只写压缩数据(没有头也没有尾)

  3. 完成所有单元后,我使用 adlrer32_combine() 并将所有作业输出数据的校验和转换为一个最终的 adler 32,然后我更新输出文件它在底部。

但问题是,我在 deflate 期间收到错误消息,说某些地方的数据无效。

有人已经尝试过这样的事情吗?任何相关信息都会非常有帮助。

最佳答案

您不能简单地连接原始压缩数据流。每个 deflate 流都是自终止的,因此解压将在第一个流结束时结束。

您需要更仔细地查看 pigz 代码以了解如何合并 deflate 流。您可以使用 Z_SYNC_FLUSH 完成最后一个 block 并将其带到字节边界而不结束 deflate 流。然后你可以完成放气流,并剥离标记为结束 block 的最后一个空 block 。除了应该正常终止的最后一个放气流。然后,您可以连接一系列 n-1 未终止的 deflate 流和最后一个 1 终止的 deflate 流。

关于linux - 如何使用多线程进行 zlib 压缩(相同输入源),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30794053/

相关文章:

algorithm - OCaml 在列表中插入一个元素

c# - 如何递归压缩文件夹?

c - 从远程线程返回两个值(C,Windows)

linux下php从串口读取数据

c - 一个 C 文件在 Linux 中调用并运行另一个 C 文件

c - SPI EP93xx(带 Linux 的 TS7200 板)

c++ - 在非平凡计算中使用 OpenMP 未获得预期的加速

c++ - 启动多个线程,只等待一个线程结束获取结果

java - 如何对由 zopfli 压缩的 png 进行充气

linux - 如何删除第二列中的值出现特定次数的文件的行?