Python使用bz2等方法压缩大量文件(或一个大文件)的示例 提供了一个非常好的例子。
pigz 表示可以通过利用并行压缩来做得更好。
据我所知(和谷歌搜索),目前在纯Python代码中找不到类似于 pigz
的并行实现。
是否有 pigz
或等效工具的并行Python实现?
Python使用bz2等方法压缩大量文件(或一个大文件)的示例 提供了一个非常好的例子。
pigz 表示可以通过利用并行压缩来做得更好。
据我所知(和谷歌搜索),目前在纯Python代码中找不到类似于 pigz
的并行实现。
是否有 pigz
或等效工具的并行Python实现?
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())
我成功将72个CPU服务器上的压缩时间从45分钟缩短至5分钟。
pgzip
取代了 mgzip
。mgzip
自 2020 年以来没有得到更新。https://github.com/pgzip/pgzip - OrderFromChaospigz
接口,但如果您真的需要,编写它可能并不难。Python的zlib
模块允许压缩任意字节块,pigz
手册已经描述了并行压缩和输出格式的系统。zlib
来压缩通过multiprocessing.dummy.Pool.imap
包装的块(multiprocessing.dummy
是multiprocessing
API的线程支持版本,因此发送块到工作进程并从中接收数据不会产生巨大的IPC成本)以并行压缩。由于zlib
是少数几个在CPU密集型工作期间释放GIL的内置模块之一,因此您可能会从基于线程的并行性中获得好处。zlib
压缩相似(在数量级左右);如果您的数据源无法比线程更快地提供数据,则并行化不会带来太多收益。mmap
的忠实粉丝,而且zlib.compress
似乎支持缓冲区协议(也就是说,它可以从mmap
的memoryview
中读取数据以避免复制数据)。你仍然需要imap
来协调工作线程拉取块并组织输出(由于无法预测压缩块的大小,因此最好对写入进行序列化)。 - ShadowRangermmap
。将其传回父进程感觉不太优化。 - Roland Smithflush()
操作和Z_SYNC_FLUSH
,以完成最后一个deflate块,并在字节边界结束它。您可以将这些连接起来以生成有效的deflate流,只要您连接的最后一个被刷新为Z_FINISH
(这是flush()
的默认值)。
gzip
压缩了。新的zstd
压缩通常比gzip更快,且生成的压缩文件更小。 - Roland Smithgzip
更快,但有许多选项可以“压缩得更快”。gzip
之所以仍然存在,至少部分原因是由于兼容性问题;您可以在具有10年以上硬件/软件的系统上解压缩它,并且它可能已默认安装(bz2
几乎同样普及,xz
正在逐渐普及)。对于将数据分发给许多方,可移植性和压缩比比速度更重要。对于短暂的压缩,速度通常胜过压缩比,因此lz4
或lzo
可能会胜过zstd
。 - ShadowRangerxz
压缩,并对按需压缩的数据使用lz4
/snappy
/lzo
,其中更快的压缩意味着数据到达得更快,具有“足够好”的压缩。 - ShadowRanger