【问题标题】:Is it possible to parallelize bz2's decompression?是否可以并行bz2的解压?
【发布时间】:2017-09-19 12:47:11
【问题描述】:

我正在使用 pythons bz2 模块生成(并压缩)一个大型 jsonl 文件(bzip2 压缩 17GB)。

但是,当我后来尝试使用 pbzip2 解压它时,它似乎只使用 一个 CPU-core 进行解压,这很慢。

当我使用 pbzip2 压缩它时,它可以利用多个核心进行解压缩。有没有办法在python中以pbzip2兼容的格式压缩?

import bz2,sys
from Queue import Empty
#...
compressor = bz2.BZ2Compressor(9)
f = open(path, 'a')

    try:
        while 1:
            m = queue.get(True, 1*60)
            f.write(compressor.compress(m+"\n"))
    except Empty, e:
        pass
    except Exception as e:
        traceback.print_exc()
    finally:
        sys.stderr.write("flushing")
        f.write(compressor.flush())
        f.close()

【问题讨论】:

  • 从我读到的并行磁盘 I/O 是bad idea。话虽这么说this answer may be relevant 这个问题。
  • @JamesDraper 磁盘 I/O 不会成为限制因素,尽管 ... bzip 计算速度很慢
  • @worenga 请注意,如果您可能使用顶级数字,那么 jsonl 是一种危险的格式,因为它们很容易被截断。 Json-seq 通过强制出错来解决这个问题。
  • 你使用BZ2Compressor而不是BZ2File有什么原因吗?
  • @o11c BZ2File 不支持模式'a'。

标签: python python-2.7 multiprocessing bzip2 bzip


【解决方案1】:

一个pbzip2 流只不过是多个bzip2 流的串联。

一个使用shell的例子:

bzip2 < /usr/share/dict/words > words_x_1.bz2
cat words_x_1.bz2{,,,,,,,,,} > words_x_10.bz2
time bzip2 -d < words_x_10.bz2 > /dev/null
time pbzip2 -d < words_x_10.bz2 > /dev/null

我从未使用过 python 的 bz2 模块,但在 'a'ppend 模式下关闭/重新打开流应该很容易,每隔这么多字节,以获得相同的结果。请注意,如果 BZ2File 是从现有的类文件对象构造的,则关闭 BZ2File 不会关闭基础流(这是您想要的)。

我没有测量多少字节最适合分块,但我猜每 1-20 兆字节 - 不过它肯定需要大于 bzip2 块大小 (900k)。

还请注意,如果您记录每个块的压缩和未压缩偏移量,您可以进行相当有效的随机访问。这就是dictzip 程序的工作原理,尽管它基于gzip

【讨论】:

    【解决方案2】:

    如果您绝对必须在解压缩时使用pbzip2,这对您没有帮助,但替代lbzip2 可以对“普通”.bz2 文件执行多核解压缩,例如由 Python 的 BZ2File 或传统的bzip2 命令。这避免了您所描述的pbzip2 的限制,只有在文件也使用pbzip2 压缩的情况下才能实现并行解压缩。见https://lbzip2.org/

    作为奖励,基准测试表明lbzip2 在解压缩(30%)和压缩(40%)方面都比pbzip2 快得多,同时实现了略高的压缩比。此外,它的峰值 RAM 使用率不到pbzip2 使用的 RAM 的 50%。见https://vbtechsupport.com/1614/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2018-01-28
      • 1970-01-01
      相关资源
      最近更新 更多