LoginSignup
14
13

More than 3 years have passed since last update.

マルチコア対応したpigzでファイル圧縮・解凍を高速化させる

Posted at

リモートにあるマシンとファイルをやり取りする…などで圧縮・解凍する場面が出てきますが、標準の gzipzip コマンドではマルチコアに対応していません🤔
他のコアは全く使っていないのに遅い…そこで、マルチコアに対応した 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

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13