pigz 2.8:一块 128KB 并行压,输出仍是标准 gzip 格式

摘要

pigz 是 gzip 的并行实现,把输入切成 128KB 一块分给多个核压,输出仍是标准 gzip;最新版 2.8 停在 2023 年 8 月,解压只能单线程。

推荐
软件名称
pigz
版本
2.8
收费
免费
开源
开源
操作系统
Linux
更新时间
2026-10-23 21:28

pigz 是 gzip 的并行实现,2007 年由 Mark Adler 写出来,名字就是 parallel implementation of gzip 的缩写。它把输入切成 128 KB 一块,交给多个核同时压,写回去仍是一个标准 gzip 文件。眼下挂在官方源码页上的最新版本是 2.8,日期 2023 年 8 月 19 日。

2.8 之后,版本号停了三年

官方源码页上写着 pigz source code version 2.8(19 Aug 2023),源码包 118K,旁边标着 SHA-256 校验值与 GPG 签名。代码仓库里的提交也停在 2023 年 8 月,那条提交的说明就一行:版本号 2.8。

三年不出新版,不等于项目停摆。DEFLATE 的数据格式早就定死,解压端遍布各种系统,一个只负责把压缩摊到多核上的工具,只要输入输出不变,就没有非改不可的理由。2.8 那版动的是细节:改成只在普通文件上写修改时间,让 pigz 能吃两段式的 zlib 版本号,还有几处断言与空指针的小修。这类补丁做完,功能面就封口了。

一块 128KB,压完再串回去

做法不绕:输入被切成 128 KB 的块,每块独立压缩,每块的校验值也顺手并行算出来。压好的片段由一个写线程按原顺序拼接,收口时用各块的校验值合成一个总的,再套上 gzip 的头与尾。所以输出的还是那种任何解压器都认得的文件,看不出它是分块压的。

分块压缩通常会让压缩率掉一截,因为后一块拿不到前一块的上下文。pigz 在这里补了一手:每块开工前,把上一块的最后 32K 作为预置字典灌进去,等于把单线程 deflate 顺手就能拿到的历史窗口搬了过来。收尾时每块要在字节边界上对齐,会多出四到五个字节的开销 —— 一块一百多 KB,摊下来可以忽略。

两个旋钮:线程数与块大小

压缩线程数默认跟着在线处理器走,几核就开几个,用 -p 改;写 -p 1 就完全不用线程,退回和普通 gzip 一样的路子。块大小默认 128K,用 -b 改。块开大,压缩率好些、并行度差些;块开小,核吃得更满,压缩率和额外开销都要让一点。这两个参数是调速度与压缩率的主要手段。

它对环境的依赖很少:官方 README 写的是只依赖 zlib 与 pthread 两个库,没有夹带第三方代码,所以能编到各类 Unix 风格系统上。zlib 至少要到 1.2.3,官方更推荐 1.2.6 之后的版本,因为块与块之间的那点额外开销被压得更小。

解压这条线,并行不起来

deflate 的数据流前后咬合,解压端必须按顺序走,除非压缩时就把流切成能各自解码的块。所以 pigz 解压只用单个主线程,另外开三个线程分别管读取、写入与校验计算 —— 某些情况下确实能快一些,但那不是把解压摊到每个核上。想要彻底单线程跑,可以写 -dp 1 或 -tp 1。

这也解释了一个常见误解:拿 pigz 压完的文件,解压时并不会跟着变快。压缩端省下的时间,解压端拿不回来。要两侧都受益,得让压缩时用下面说的独立块模式。

-i 换的是随机访问与容错

加上 -i 或 --independent,各块不再互相引用字典,每块都能单独解开。好处有两个:一块数据坏了,后面的还能读出来;想直接跳到文件中间某段,也不必从头解。为了让解码器知道块边界在哪,每块前面会插入九个字节的固定标记,十六进制是 00 00 FF FF 00 00 00 FF FF。代价是压缩率回到分块压缩的水平,前面那套预置字典的补偿没了。

从 -0 到 -11

压缩级别与 gzip 一致,-0 是不压缩,-9 压得最狠也最慢,默认落在 -6。pigz 多出一个 -11,用 Jyrki Alakuijala 的 zopfli 算法反复迭代,压缩率能再挤出几个百分点,耗时却显著上升 —— 官方手册里的原话是 a severe cost in execution time。围着 -11 还有一组专用参数:迭代次数默认 15,最大分块数默认 15,也可以让它不切块、或者先迭代再切块。

输出格式三选一:默认 gzip,加 -z 输出 zlib 的 .zz,加 -K 输出单条目 zip。另有 -R 让块的切分位置跟输入内容走,好处是改了一小段之后,再压缩时相同部分的位置不变,增量传输只传变动的那截。批量压日志、压备份这类一次压一大批的场景,块与核的配合才真正省时间。

许可证只有三句话

pigz 用的是 zlib 那种宽松许可:任何人可以把软件用于任何目的,可以改,可以再分发。要求只有三条 —— 不许冒名说成自己写的,改过的版本要标明,这段声明不许删。作者 Mark Adler 也是 zlib 的两位作者之一,zlib 官网写着他负责解压那一半,pigz 里那套分块与字典的把戏,和他手里的库是同一路数。

名字的读法官方专门解释过:念 pig-zee,不是 pig 的复数。这种问题被写进首页,多少能看出这个项目的气质 —— 文档就一页,参数写在手册里,剩下的交给源码。

把压缩摊到多核,是 pigz 唯一的卖点,也是它二十年只需小修的原因:gzip 的格式没变,它能做的事就没变。真要挑毛病,解压那条线依旧单线程,快只在压缩端。

pigz下载地址
支持的操作系统: Linux