128KB ずつ分けて複数の芯に渡し、書き出すのは普通の gzip、pigz 2.8
要約
入力を小さく切って各々の芯に配り、出てくるのはどの解き手でも読める普通のファイル。伸張は速くならず、-11 は時間と引き換えになる。その取り合わせは 2.8 から動いていない。
おすすめ- ソフト名
- pigz
- バージョン
- 2.8
- 料金
- 無料
- オープンソース
- オープンソース
- OS
- Linux
- 公式サイト
- https://zlib.net/pigz/
- 更新日時
- 2026-10-23 21:28
pigz は gzip を分けて走らせる作りで、2007 年に Mark Adler が書いた。名は parallel implementation of gzip の頭の数文字をそのまま取ったものだ。入力は 128 KB ずつに切られ、複数の芯へ同時に渡され、書き戻されるのは 1 つの普通の gzip のファイルである。公式の源の場所に載っているのは 2.8 で、日付は 2023 年 8 月 19 日。
2.8 のあと、版の番号は 3 年止まった
源の場所には pigz source code version 2.8(19 Aug 2023)と書かれ、隣に 118K の源の包み、さらに隣に SHA-256 の照合の値と GPG の署名が並ぶ。コードの倉庫の書き込みも 2023 年 8 月で止まり、最後の 1 つの説明は 1 行だけ、版の番号 2.8。
新しい版が出ないことは、企画が止まったことを意味しない。DEFLATE の形はとうに固まり、解く側はあらゆる仕組みに散らばっている。圧縮を複数の芯に配ることだけを担う道具は、入るものと出るものが変わらなければ、変える理由を持たない。2.8 が触ったのは細部だ。書き換えの時刻を普通のファイルにだけ書くこと、2 段構えの zlib の版の番号を受け取れるようにすること、それに表明と空の指し先まわりの小さな修繕。そうした繕いが済めば、機能の面は閉じる。
128 KB に切り、辞書を流し込み、また繋ぐ
やり方は遠回りではない。入力は 128 KB の塊に裁たれ、各々が単独で圧縮され、各々の照合の値もそのついでに並行して計算される。出来た断片は書き込みのスレッドが元の順に繋ぎ、最後に各塊の照合の値を 1 つにまとめ、gzip の頭と尻をかぶせる。だから出てくるのはどの解き手でも読める形のファイルで、塊ごとに圧したことは見えない。
塊ごとの圧縮はたいてい圧縮の率を落とす。後の塊が前の塊の前後関係を持てないからだ。ここを埋めるのが、塊が始まる前に前の塊の最後の 32K をあらかじめの辞書として流し込む手で、1 本のスレッドの deflate がただで持っていた履歴の窓をそのまま運んでくることに等しい。繋ぐときは各塊がバイトの境目で終わる必要があり、4 から 5 バイトの余分が乗る。100 KB を超える塊に対しては無視できる。
2 つのつまみ:スレッドの数と塊の大きさ
圧縮のスレッドの数は既定で動いている処理の器に従い、芯の数だけ開く。-p で変えられ、-p 1 と書けばスレッドをまったく使わず、普通の gzip と同じ道へ戻る。塊の大きさは既定が 128K で、-b で変える。塊を大きくすれば率が良くなり並びが悪くなり、小さくすれば芯がよく埋まり、率と余分の両方を少しずつ手放す。速さと大きさの交換は、主にこの 2 つで行う。
周りへの要求は少ない。公式の手引きは zlib と pthread の 2 つだけに頼り、他所のコードを挟んでいないと書く。だから様々な Unix の流れの仕組みで組める。zlib は少なくとも 1.2.3 が要り、作り手は 1.2.6 より後を勧める。塊と塊の間の余分がそこで小さく抑えられるからだ。
解く側は並ばない
deflate の流れは前と後ろが噛み合っていて、解く側は順に進むしかない。圧縮のときに、それぞれ単独で解ける塊へ流れを切っていない限りは。だから pigz が解くときに使う主のスレッドは 1 本で、ほかに読み、書き、照合の計算のために 3 本を起こす。場合によっては確かに速くなるが、解くことを芯ごとに配っているわけではない。すべて 1 本にしたいときは -dp 1 か -tp 1 と書く。
ここでよくある取り違えをほどいておく。pigz で圧したファイルは、解くときに速くはならない。圧す側で省いた時間は、解く側では取り戻せない。両側で得したいなら、圧すときに次に述べる独立の塊の様式を使うほかない。
-i が買うのは飛び読みと粘り
-i あるいは --independent を付けると、塊どうしが辞書を参照しなくなり、どの塊も単独で解ける。利点は 2 つ。1 つの塊が壊れても後ろは読め、ファイルの途中へ直接飛ぶのにも頭から解く必要がない。解く側が境目を知るために、各塊の前に 9 バイトの決まった印が挟まれる。16 進で 00 00 FF FF 00 00 00 FF FF だ。代わりに率は塊ごとの圧縮の水準へ戻り、先の辞書による埋め合わせは消える。
-0 から -11 まで
圧縮の段は gzip と同じで、-0 は圧さずに収め、-9 が最も強く最も遅く、既定は -6 に落ちる。pigz は -11 を足す。Jyrki Alakuijala の zopfli という手順を繰り返し回し、率を数パーセント余分に絞るが、時間ははっきり増える。公式の手引きの言葉では、実行の時間に重い代価を払う。-11 のまわりには専用の引数が揃う。繰り返しの回数は既定 15、塊の最大数も既定 15、切らずに回すことも、回してから切ることもできる。
出力の形は 3 つから選ぶ。既定は gzip、-z で zlib の .zz、-K で 1 つの項目だけの zip。さらに -R があり、切る位置を入力の中身に従わせる。少し書き換えたあとに圧し直しても同じ部分が同じ位置に残り、差分の送信が動いた所だけを運ぶ。記録や控えをまとめて圧すように、一度に多くの量が流れる状況でこそ、塊と芯の組み合わせが時間を生む。
許諾は 3 文、名前の読み方も決まっている
許諾は zlib のゆるい形だ。誰でもどんな目的にも使え、変えられ、配り直せる。求められるのは 3 つだけ。自分が書いたと言わないこと、変えた版には印を付けること、この断り書きを消さないこと。Mark Adler は zlib の 2 人の書き手の 1 人でもあり、zlib の場所には解く側の半分を彼が担うとある。pigz の塊と辞書の手管は、彼が持つその庫と同じ引き出しから出ている。
名前の読み方は公式がわざわざ説明している。pig-zee であって、pig の複数ではない。そうした問いが最初の画面に書かれていること自体、この企画の気質を語っている。手引きは 1 枚、引数は説明書の中、残りは源に任せる。
圧縮を複数の芯へ配ることが pigz の唯一の売りもので、20 年が小さな修繕で済んだ理由でもある。gzip の形が変わっていないのだから、この道具にできることも変わっていない。正直に難を言えば、解く側は今も 1 本のスレッドで、速いのは圧す側だけだ。