私は通常tar zcvf
を使用して圧縮し、tar zxvf
を使用して解凍します(習慣上gzipを使用)。
私は最近ハイパースレッディング付きのクアッドコアCPUを手に入れたので、私は8つの論理コアを持っています、そして私はコアの多くが圧縮/解凍の間未使用であることに気付きます。
未使用のコアを利用して高速化する方法はありますか。
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
Tarフラグ "--use-compress-program ="を使用して、tarに使用する圧縮プログラムを指定することもできます。
例えば、
tar -c --use-compress-program=pigz -f tar.file dir_to_Zip
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には、次のような小さなシェルスクリプトが必要です。
#!/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 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
Tarの-I
スイッチにはショートカット--use-compress-program
を使用し、マルチコアでのbzip2圧縮にはpbzip2
を呼び出すことができます。
tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
ファイル名や圧縮オプションをもっと柔軟にしたい場合は、次のようにします。
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
find
find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec
このコマンドはアーカイブしたいファイル、この場合は/my/path/*.sql
と/my/path/*.log
を探します。必要なだけ-o -name "pattern"
を追加してください。
-exec
は、find
の結果を使用して次のコマンドを実行します。tar
tar
tar -P --transform='s@/my/path/@@g' -cf - {} +
--transform
は単純な文字列置換パラメータです。アーカイブからファイルのパスを削除するので、展開時にtarballのルートが現在のディレクトリになります。 find
の利点を失うので、ディレクトリを変更するために-C
オプションを使用することはできません。ディレクトリのすべてのファイルが含まれることになります。
-P
はtar
に絶対パスを使うように指示するので、「メンバー名から先頭の `/ 'を削除する」という警告は表示されません。とにかく先頭の '/'は--transform
によって削除されます。
-cf -
は、後で指定するtarball名を使用するようにtar
に指示します。
{} +
は、find
が以前に見つけたすべてのファイルを使用します
pigz
pigz -9 -p 4
必要な数のパラメータを使用してください。この場合、-9
は圧縮レベル、-p 4
は圧縮専用のコア数です。高負荷のWebサーバーでこれを実行すると、おそらくすべての利用可能なコアを使いたくないでしょう。
> myarchive.tar.gz
最後に。