【问题标题】:How do you prepare deflate streams for PIGZ (parallel gzip)?您如何为 PIGZ(并行 gzip)准备放气流?
【发布时间】:2018-01-10 21:12:25
【问题描述】:

我正在使用 PIGZ 库。 https://zlib.net/pigz/

我使用这个库对每个文件使用多个线程来压缩大文件,现在我也想使用每个文件的多个线程来解压缩这些文件。根据文档:

解压是不能并行的,至少在没有特别的情况下是不能并行的 为此目的准备了 deflate 流。

但是,文档没有具体说明如何做到这一点,而且我发现很难找到这方面的信息。

我将如何创建这些 PIGZ 可用于解压的“专门准备的放气流”?

【问题讨论】:

  • 这并没有说明 PIGZ 可以做到,只是流需要是一种不寻常的格式才能使它成为可能。简而言之,您需要带有重置或重新传输压缩字典的索引位置。 bzip2 分块压缩,所以 pbzip2 可以并行解压。
  • 如果您想要可以将大型二进制文件分解为单独压缩的块并并行检索和解压缩它们的工具,我可以建议desync吗? (这是casync 的第 3 方实现,旨在允许此类功能,但目前实际上并未并行化)。

标签: linux bash parallel-processing gzip


【解决方案1】:

pigz 目前不支持并行解压,所以专门准备这样一个 deflate 流也无济于事。

这没有实现的主要原因是,在大多数情况下,解压缩速度足够快,可以受 i/o 限制,而不是处理器限制。压缩不是这种情况,它可能比解压缩慢得多,而并行压缩可以大大加快速度。

您可以使用 zlib 和 pthread 编写自己的并行解压缩器。 pigz 2.3.4 及更高版本实际上将使用 --independent (-i) 选项为并行解压缩制作一个特别准备的流。这使得块可以独立解压缩,并在每个前面放置两个同步标记,以便通过扫描压缩数据快速找到它们。块的未压缩大小使用--blocksize 或-b 设置。您可能希望使该大小大于默认值,例如1M 而不是 128K,以减少使用 -i 的压缩影响。一些测试会告诉您使用 -i 减少了多少压缩。

(顺便说一下,pigz 不是一个库,它是一个命令行实用程序。)

【讨论】:

  • 所以如果我理解正确的话,你是说 pigz 有能力使用 -i 选项产生放气流,但我实际上必须编写自己的解压缩器来利用这些流?
  • 看你是作者,虽然我把你带到这里 ;) 压缩速度如何受块大小的影响?
  • 压缩速度并不明显取决于块大小。除非您使块大小接近文件大小,否则没有足够的块给所有核心进行压缩。
  • pigz 总是使流放气。 -i 使它们独立地可解压缩和可定位。然后,是的,您必须编写自己的解压缩器才能利用这一点并在多个内核中执行。
猜你喜欢
  • 2012-12-09
  • 2010-09-19
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2019-05-27
  • 2021-08-04
相关资源
最近更新 更多