web-dev-qa-db-ja.com

tar + gzip / bzip圧縮/解凍にマルチコアを利用する

私は通常tar zcvfを使用して圧縮し、tar zxvfを使用して解凍します(習慣上gzipを使用)。

私は最近ハイパースレッディング付きのクアッドコアCPUを手に入れたので、私は8つの論理コアを持っています、そして私はコアの多くが圧縮/解凍の間未使用であることに気付きます。

未使用のコアを利用して高速化する方法はありますか。

186
user1118764

Gzipの代わりに pigz を使うことができます。これはマルチコアでgzip圧縮を行います。 -zオプションを使用する代わりに、pigzを介してパイプ処理します。

tar cf - paths-to-archive | pigz > archive.tar.gz

デフォルトでは、pigzは使用可能なコアの数を使用します。それを照会できなかった場合は8を使用します。 -p nを使うともっと多くのことを尋ねることができます。 -p 32. pigzにはgzipと同じオプションがあるので、-9を指定するとより良い圧縮を要求できます。例えば。

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
260
Mark Adler

Tarフラグ "--use-compress-program ="を使用して、tarに使用する圧縮プログラムを指定することもできます。

例えば、

tar -c --use-compress-program=pigz -f tar.file dir_to_Zip 
276
Jen

共通の取り組み

tarプログラムにはオプションがあります。

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

マルチスレッド版のアーカイバまたはコンプレッサユーティリティを使用できます。

最も人気のあるマルチスレッドアーカイバは pigz (gzipの代わりに)そして pbzip2 (bzip2の代わりに)です。例えば:

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive

アーカイバは-dを受け入れなければなりません。あなたの置き換えユーティリティがこのパラメータを持っていなかったり、追加のパラメータを指定する必要があるなら、パイプを使用してください(必要ならばパラメータを追加してください):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

シングルスレッドとマルチスレッドの入出力は互換性があります。マルチスレッドバージョンを使用して圧縮したり、シングルスレッドバージョンを使用して圧縮解除したりできます。

p7Zip

圧縮用のp7Zipには、次のような小さなシェルスクリプトが必要です。

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null

7zhelper.shとして保存します。ここでの使用例:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

xz

マルチスレッドXZサポートについて。 XZ Utilsのバージョン5.2.0以降を実行している場合は、環境変数XZ_DEFAULTSを介して-Tまたは--threadsを適切な値に設定することで、圧縮に複数のコアを使用できます(例:XZ_DEFAULTS="-T 0")。

これは5.1.0アルファバージョンのmanの断片です:

マルチスレッド圧縮と解凍はまだ実装されていないので、このオプションは今のところ効果がありません。

ただし、これはスレッド化を有効にして圧縮されていないファイルの解凍には機能しません。バージョン5.2.2のmanから:

スレッド解凍はまだ実装されていません。ブロックヘッダーにサイズ情報を持つ複数のブロックを含むファイルに対してのみ機能します。マルチスレッドモードで圧縮されたファイルはすべてこの条件を満たしますが、シングルスレッドモードで圧縮されたファイルは--block-size = sizeが使用されていてもそうではありません。

置き換えて再コンパイル

ソースからtarを構築した場合は、パラメータを指定して再コンパイルできます。

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

これらのオプションを指定してtarを再コンパイルした後は、tarのヘルプの出力を確認できます。

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz
94
Maxim Suslov

Tarの-Iスイッチにはショートカット--use-compress-programを使用し、マルチコアでのbzip2圧縮にはpbzip2を呼び出すことができます。

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
11
panticz.de

ファイル名や圧縮オプションをもっと柔軟にしたい場合は、次のようにします。

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

ステップ1:find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

このコマンドはアーカイブしたいファイル、この場合は/my/path/*.sql/my/path/*.logを探します。必要なだけ-o -name "pattern"を追加してください。

-execは、findの結果を使用して次のコマンドを実行します。tar

ステップ2:tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transformは単純な文字列置換パラメータです。アーカイブからファイルのパスを削除するので、展開時にtarballのルートが現在のディレクトリになります。 findの利点を失うので、ディレクトリを変更するために-Cオプションを使用することはできません。ディレクトリのすべてのファイルが含まれることになります。

-Ptarに絶対パスを使うように指示するので、「メンバー名から先頭の `/ 'を削除する」という警告は表示されません。とにかく先頭の '/'は--transformによって削除されます。

-cf -は、後で指定するtarball名を使用するようにtarに指示します。

{} +は、findが以前に見つけたすべてのファイルを使用します

ステップ3:pigz

pigz -9 -p 4

必要な数のパラメータを使用してください。この場合、-9は圧縮レベル、-p 4は圧縮専用のコア数です。高負荷のWebサーバーでこれを実行すると、おそらくすべての利用可能なコアを使いたくないでしょう。

ステップ4:アーカイブ名

> myarchive.tar.gz

最後に。

0
Bloops