読者です 読者をやめる 読者になる 読者になる

解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【マルチコア向け】並行処理でアーカイブ処理を速くする

xz や bzip2、gz などのアーカイブを圧縮したり展開したりする際にも、 マルチコアやマルチCPUのマシンであれば、並行処理をさせれば速くなるはずです。 (むしろ、1コアだけしか使用しないと、コア数×クロック周波数の速度では出ず遅くなり、損です。)

そこで、並行処理の可能なアーカイバを探してみると、 Gentooでは例えば $ eix -C app-arch -S parallel と検索してみればすぐ見つかります。

$ eix -C app-arch -S parallel -\#
app-arch/lbzip2
app-arch/pbzip2
app-arch/pigz
app-arch/pixz
app-arch/plzip
app-arch/pxz

gzipアーカイバ

GNU の旧来の標準的アーカイブ形式。サフィックスは .gz

pigz

Upstream: http://www.zlib.net/pigz/


bzip2 のアーカイバ

Linux カーネルの配布にも以前は採用していたアーカイブ形式。 サフィックスには .bz2 が一般的。

lbzip2

Upstream: http://lbzip2.org/

pbzip2

Upstream: http://compression.ca/pbzip2/

lbzip2 と pbzip2 のどちらが良い?

lbzip2 の方が高速だとも言われています。

最大の差異はライセンスで、 lbzip2 は GPLv3 or laterです。 pbzip2 は、 bzip2 の libbzip2 を利用しており、 bzip2 と同じ BSD ライセンス風のライセンスです(つまり、いわゆるコピーレフトではない(permissive;lax))。

それはまた、 pbzip2 は 元の bzip2 に並行化を加えたもの、 lbzip2 は新規に書き下ろしたものだというようにも言えます。 おそらく lbzip2 でも互換性に支障はありませんが、ソースコード自体は pbzip2 の方が bzip2 に近い(かわりに遅い)ということです。


xz のアーカイバ

Linux カーネルの配布にも現在採用されている形式。 サフィックスは .xz

pixz

アーカイブに、含まれるファイルのリスト(インデックス)を保持させることが可能。 そのため、ファイルリストは、アーカイブ全体を展開しなくても得られるようになり、特定のファイル抽出が早くなります。 サフィックス.tpxz

しかし、このインデックスは、オリジナルの xz-utils(xz) で展開するときだと意味がありません。 -tオプションを付けることでインデックス無しのアーカイブも可能です。

Upstream: https://github.com/vasi/pixz

pxz

圧縮専用

Upstream: http://jnovy.fedorapeople.org/pxz/


lzip のアーカイバ

LZMA 系の圧縮形式。殆ど見かけません。サフィックスは .lz

https://ja.wikipedia.org/wiki/Lzip

plzip

Upstream: http://www.nongnu.org/lzip/plzip.html


GentooPortage で使うには

/etc/portage/make.conf 内に PORTAGE_BZIP2_COMMAND PORTAGE_BUNZIP2_COMMAND を設定します。 $ LC_ALL=C man 5 make.conf 参照 https://dev.gentoo.org/~zmedico/portage/doc/man/make.conf.5.html

bzip2 で圧縮されているソースアーカイブの展開や、バイナリパッケージを作成時の圧縮などで速くなると思われます。 ただし残念ながら、 xz や gz 用の設定はありません。

ついでに言うと、 Portage はドキュメントを自動的に圧縮しますが、その際にはデフォルトでは bzip2 です (この圧縮済ファイルは、bzcatbzless で読めます)。 この設定は、 PORTAGE_COMPRESSなどで変えられます。PORTAGE_COMPRESS_EXCLUDE_SUFFIXES=".*"とすると、圧縮をさせないことも可能です(※この .*regexp(「正規表現」)であって、拡張子ワイルドカード」ではありません)。