128KB 一塊丟給多核,寫回去還是標準 gzip:pigz 2.8 的取捨

摘要

輸入切成小塊分給各個核心,寫出去的卻仍是任何解壓器都認得的檔案。解壓端快不起來、-11 換來的是時間,這些取捨在 2.8 之後就沒有再動過。

推薦
軟體名稱
pigz
版本
2.8
收費
免費
開源
開源
作業系統
Linux
更新時間
2026-10-23 21:28

2007 年,Mark Adler 寫了一個把 gzip 拆開來跑的東西,名字取的是「parallel implementation of gzip」的頭幾個字母。做法很直白:輸入切成 128 KB 一塊,分給好幾個核心同時壓,寫回去仍是一個標準 gzip 檔。官方源碼頁上掛的版本是 2.8,日期 2023 年 8 月 19 日。

三年沒發新版,不代表沒人管

源碼頁那行字寫著 pigz source code version 2.8(19 Aug 2023),旁邊是 118K 的源碼包,再旁邊是 SHA-256 校驗值與 GPG 簽名。程式碼倉庫的提交也停在 2023 年 8 月,最後那條的說明只有一行:版本號 2.8。

不發新版並不等於專案停擺。DEFLATE 的資料格式早就定死,解壓端散落在各種系統裡,而一個只負責把壓縮攤到多核上的工具,只要進去的東西與出來的東西不變,就沒有非改不可的理由。2.8 動的都是細節:改成只在普通檔案上寫修改時間、讓它吃兩段式的 zlib 版本號,還有幾處斷言與空指標的小修。這類補丁做完,功能面就封口了。

切塊、灌字典、再串回去

流程不繞路。輸入裁成 128 KB 的塊,每塊獨立壓,每塊的校驗值順手並行算出來;壓好的片段由一個寫入執行緒按原順序接起來,收尾時把各塊校驗值合成一個總的,再套上 gzip 的頭與尾。所以出去的檔案,任何解壓器都認得,看不出它是分塊壓的。

分塊壓通常會讓壓縮率掉一截,因為後一塊拿不到前一塊的上下文。這裡補了一手:每塊開工前,把上一塊最後的 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。

順帶澄清一個常見誤會:用它壓完的檔案,解壓時並不會跟著變快。壓縮端省下的時間,解壓端拿不回來。要兩邊都受益,壓縮時就得改用下面那個獨立塊模式。

-i 換的是容錯與跳讀

加上 -i 或 --independent,各塊不再互相引用字典,每塊都能單獨解開。好處有兩個:一塊資料壞了,後面的還讀得出來;想直接跳到檔案中間某段,也不必從頭解。為了讓解碼器知道塊邊界在哪,每塊前面會插入九個位元組的固定標記,十六進位是 00 00 FF FF 00 00 00 FF FF。代價是壓縮率回到分塊壓縮的水準,前面那套預置字典的補償就沒了。

從 -0 到 -11

壓縮級別與 gzip 一致,-0 是不壓,-9 壓得最狠也最慢,預設落在 -6。pigz 多出一個 -11,用 Jyrki Alakuijala 的 zopfli 反覆迭代,壓縮率能再擠出幾個百分點,耗時卻明顯上升,官方手冊的說法是執行時間上付出沉重代價。圍著 -11 還有一組專用參數:迭代次數預設 15、最大分塊數預設 15,也可以讓它不切塊,或先迭代再切塊。

輸出格式三選一:預設 gzip,加 -z 輸出 zlib 的 .zz,加 -K 輸出單條目 zip。另有 -R,讓切分位置跟著輸入內容走,好處是改了一小段之後再壓,相同部分的位置不變,增量傳輸只傳動到的那截。批量壓日誌、壓備份這種一次一大批的場景,塊與核的配合才真正省時間。

授權只有三句話,名字要唸對

授權用的是 zlib 那種寬鬆條款:任何人可以把軟體用於任何目的,可以改,可以再散布。要求只有三條——不許冒名說是自己寫的、改過的版本要標明、這段聲明不許刪。Mark Adler 也是 zlib 的兩位作者之一,zlib 官網寫著他負責解壓那一半,pigz 裡那套分塊與字典的手法,跟他手上的庫是同一路數。

名字怎麼唸,官方特別解釋過:pig-zee,不是 pig 的複數。這種問題會被寫進首頁,多少看得出這個專案的氣質——說明只有一頁,參數在手冊裡,其餘交給源碼。

把壓縮攤到多核是 pigz 唯一賣的東西,也是它二十年只需小修的原因:gzip 的格式沒變,它能做的事就沒變。真要挑毛病,解壓那條線依舊單執行緒,快只快在壓縮端。

pigz下載地址
支援的作業系統: Linux