リモートにあるマシンとファイルをやり取りする…などで圧縮・解凍する場面が出てきますが、標準の gzip
や zip
コマンドではマルチコアに対応していません🤔
他のコアは全く使っていないのに遅い…そこで、マルチコアに対応した pigz
を用いてファイルの圧縮・解凍を高速化させましょう。
インストール
yum
, apt-get
などのパッケージマネージャーで導入できます。
ソースコードからのインストールが必要な場合は pigzのホームページ から入手できます。
圧縮
1つのファイルを圧縮する
pigz
にはファイル名を指定するオプションが無いため、 -c
オプションで圧縮結果を標準出力に出してからリダイレクトで指定したファイルに入れます。
$ pigz --best -c db_dump.txt > single_file.gz
実用的な最高圧縮率で圧縮したいため --best
のオプションを付けています。 --best
は -9
と同じですが、時間を犠牲にしてでも最高の圧縮を求めたい場合は -11
まで圧縮率を指定できます。
$ man pigz
...
-# --fast --best
Regulate the speed of compression using the specified digit #, where -1 or --fast indicates the fastest compression method (less compres‐
sion) and -9 or --best indicates the slowest compression method (best compression). -0 is no compression. -11 gives a few percent better
compression at a severe cost in execution time, using the zopfli algorithm by Jyrki Alakuijala. The default is -6.
ディレクトリなど複数ファイルの圧縮は tar
でまとめてから圧縮する
pigz
で圧縮する際にディレクトリを指定して -r
で再帰的に圧縮しようとすると、 指定されたファイル一つずつつに対して圧縮ファイルを作成します。
zip
コマンドの感覚でやってしまうとディレクトリ内にある元のファイルが一つずつzip置き換えられます😱
そこで、一度 tar
で1ファイルにまとめてからそのファイルを pigz
で圧縮します。
$ tar c Directory | pigz --best > multiple_files.tar.gz
解凍
pigz
を用いた解凍について
pigz
ではマルチコアで解凍ができません。 …がファイルの読み書きなどは並列化されるため、結果として高速になる場合があります。
$ man pigz
...
Decompression can't be parallelized, at least not without specially prepared deflate streams for that purpose. As a result, pigz uses a single
thread (the main thread) for decompression, but will create three other threads for reading, writing, and check calculation, which can speed up
decompression under some circumstances. Parallel decompression can be turned off by specifying one process ( -dp 1 or -tp 1 ).
1つのファイルを圧縮した場合は -d
オプションで解凍できます。
$ pigz -d single_file.gz
ディレクトリなどを圧縮する前に tar
にまとめてしまった場合は tar
コマンドの --use-compress-prog
オプションを使って解凍すると良いでしょう。
解凍に pigz
を使いながらtarの展開まで自動で実行されます👍
$ tar -xvf multiple_files.tar.gz --use-compress-prog=pigz
マルチコアで解凍できないというけど…🤔
ざっと解凍してみると、 pigz
ではすべて解凍し終わるまでの時間が短くなっていることがわかります(4-coreのCPU, テキストファイル534個を圧縮した434MBのtar.gzにて)
$ time tar -xvf multiple_files.tar.gz
...
real 0m18.233s
user 0m16.780s
sys 0m4.346s
$ time tar -xvf multiple_files.tar.gz --use-compress-prog=pigz
...
real 0m9.317s
user 0m10.973s
sys 0m4.556s
参考
マルチコアでgzファイルの圧縮解凍ができるpigzの使い方 - Qiita
https://qiita.com/itukizora/items/10a9e7fffff857de374b
pigzを使ったgzip並列圧縮 - Wolfeyes Bioinformatics beta
http://yagays.github.io/blog/2012/06/15/pigz/
bzip2とgzipのParallel版、pbzip2とpigz - done is better than perfect
https://dibtp.hateblo.jp/entry/2014/07/06/004300