如何使用Python实现并行gzip压缩?

Vir*_*hiu 5 python zlib

使用python进行大文件压缩给出了一个很好的示例,说明了如何使用例如bz2纯粹在Python中压缩非常大的文件集(或大文件)。

Pigz说,利用并行压缩可以做得更好。就我所知(和Google搜索)而言,我找不到在纯Python代码中等效的Python。

是否有并行的Python实现pigz或等效的实现?

Alf*_*rez 8

mgzip能够实现这一点

使用块索引 GZIP 文件格式来并行压缩和解压缩。该实现使用'FEXTRA'来记录压缩成员的索引,这是在官方GZIP文件格式规范版本4.3中定义的,因此它与正常的GZIP实现完全兼容。

import mgzip

num_cpus = 0 # will use all available CPUs

with open('original_file.txt', 'rb') as original, mgzip.open(
    'gzipped_file.txt.gz', 'wb', thread=num_cpus, blocksize=2 * 10 ** 8
) as fw:
    fw.write(original.read())
Run Code Online (Sandbox Code Playgroud)

我能够在 72 个 CPU 的服务器上将压缩速度从 45 分钟加快到 5 分钟

  • 请注意,对于来自同一创建者的较新的“pgzip”,“mgzip”已被弃用。自 2020 年以来,`mgzip` 尚未获得更新。https://github.com/pgzip/pgzip (3认同)

Sha*_*ger 5

我不了解pigz用于Python的临时接口,但是如果您真的需要它,编写它可能不会那么困难。Python的zlib模块允许压缩字节的任意块,并且pigz手册页描述了系统的并行压缩和已经输出格式。

如果您确实需要并行压缩,则应该可以实现pigz等效的zlib用于压缩包装的块multiprocessing.dummy.Pool.imapmultiprocessing.dummymultiprocessingAPI 的线程支持版本,因此您不会招致与工作人员之间来回发送块的大量IPC成本)并行压缩。由于zlib是在CPU绑定工作期间释放GIL的少数几个内置模块之一,因此您实际上可能会从基于线程的并行中受益。

请注意,在实践中,当压缩级别没有达到那么高的水平时,I / O的成本通常与实际zlib压缩相似(在数量级左右)。如果您的数据源实际上无法以比压缩更快的速度送入线程,那么并行化将不会带来太大收益。