我的目标是在并行线程中压缩同一源的数据。我已在列表中定义了作业,这些作业具有已读取的信息(每个作业中500kb-1MB)。
我的压缩器线程将使用ZLIB压缩每个块的数据,并将其存储在相应作业的输出中。
现在,我要合并所有内容并创建一个标准ZLIB格式的输出文件。
从ZLIB RFC中浏览了piggee的来源之后,我了解到
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)
+---+---+---+---+
就我而言,也没有字典。
因此,当我组合两个压缩单元时,所有单元的标题都是相同的。
因此,我正在执行以下操作。
对于第一个单元,我正在写标头+压缩数据。
对于第二个单元到最后一个单元,我只写压缩数据(没有标题,没有尾部)
完成所有单位后,我adlrer32_combine()
将使用所有作业输出数据的校验和并将其转换为一个最终的adler 32,然后使用底部的输出文件进行更新。
但是问题是,我在放气时出现错误,说某些地方数据无效。
有人已经尝试过类似的东西吗?任何相关信息将非常有帮助。
您不能简单地串联原始的deflate数据流。每个放气流都是自终止的,因此解压缩将在第一个流的末尾结束。
您需要更仔细地看一下Pigz代码,以了解如何合并放气流。您可以Z_SYNC_FLUSH
用来完成最后一个块并将其带到字节边界,而无需结束deflate流。然后,您可以完成deflate流,并剥离标记为结束块的最后一个空块。除了应该正常终止的最后一个放气流。然后,您可以将一系列n-1个未终止的放气流和最后1个终止的放气流连接起来。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句