ログイン新規登録

Qiitaにログインして、便利な機能を使ってみませんか?

あなたにマッチした記事をお届けします

便利な情報をあとから読み返せます

13

この記事は最終更新日から3年以上が経過しています。

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

投稿日

リモートにあるマシンとファイルをやり取りする…などで圧縮・解凍する場面が出てきますが、標準の 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

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
  3. ダークテーマを利用できます
ログインすると使える機能について
ysd_marrrr

@ysd_marrrr(Masataka Yoshida)

小学生からHTML, 高専・大学はWebアプリ(CakePHP 2.x)とスマートフォンアプリ(ObjC, Java)を作ったりしました。 HTML/CSS/JS/Vue.jsとかPHP, Node.jsなどWebで何かを作ることにフォーカスします。パソコンを触るのが好きなのでLinux/AWS/Python/シェルスクリプト…などなどに脱線します。
opst
情報技術と社員力でお客様を成功に導く Make IT Your Success

コメント

この記事にコメントはありません。

いいね以上の気持ちはコメントで

Qiita Conference 2024 4月17日(水)~19(金)開催!

Qiita Conferenceは、Qiita最大規模のテックカンファレンスです!

基調講演ゲスト(敬称略)

牛尾剛、 市谷聡啓、 けんすう、 ゆる言語学ラジオ、 田中邦裕、小城久美子、 飯沼亜紀

記事投稿キャンペーン開催中

Qiita×Findy記事投稿キャンペーン 「今の開発組織でトライしたこと・トライしていること・トライしようとしていること」

~
詳細を見る
13

新規登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる

ソーシャルアカウントでログイン・新規登録

メールアドレスでログイン・新規登録