pigzで巨大ファイル圧縮の並列化

1ファイルあたり5~7GBのテキストファイルを10数個含むトータル100GB程度のディレクトリを .tar.gz 形式に圧縮しようと試みると、全く進む気配が無い。さすがにファイルを圧縮するだけで時間を浪費するのはもったいなく、利用しているサーバは24コアの高性能のものなので有効活用できないかと考え調査。するとpigz

pigzのインストール

$ wget http://zlib.net/pigz/pigz-2.2.5.tar.gz
$ tar zxvf pigz-2.2.5.tar.gz
$ cd pigz-2.2.5
$ make
# ln -s pigz /usr/bin/

最後のシンボリックリンクのコマンドは、パスが通っているところから実行ファイルを参照可能にするため。別ディレクトリでも良いし, ln ではなく cp や mv で実行ファイルそのものを置いてしまっても問題ありません。

pigzを用いた圧縮

pigzにパスが通っていれば以下のようにすればOK。パスが通っていなくても --use-compress-prog オプションで絶対パスを指定すればできます。

$ tar cvf out.tar.gz --use-compress-prog=pigz source_files

コア数指定のオプションは無いようで、自動的にコンピュータ上の全てのコアが使われます。環境にもよりますが、24コア/256GBメモリのサーバ上ではtimeコマンドで見ても桁違いに圧縮は高速になっているし、体感でも速さが実感できるレベルになりました。