私は通常、使用して圧縮し、使用tar zcvf
して解凍しますtar zxvf
(習慣のためにgzipを使用します)。
最近、ハイパースレッディングを備えたクアッド コア CPU を入手したので、8 つの論理コアがあり、圧縮/解凍中に多くのコアが使用されていないことに気付きました。
未使用のコアを利用して高速化する方法はありますか?
複数のコアでgzip圧縮を行うgzipの代わりにpigzを使用できます。-zオプションを使用する代わりに、pigzを介してパイプします。
tar cf - paths-to-archive | pigz > archive.tar.gz
デフォルトでは、pigzは使用可能なコアの数を使用します。クエリできない場合は8つを使用します。-pnを使用してさらに要求できます(例:-p32)。pigzにはgzipと同じオプションがあるため、-9を使用してより適切な圧縮を要求できます。例えば
tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
プログラムのオプションがあります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 サポートについて。バージョン 5.2.0 以降の XZ Utils を実行している場合は、環境変数 XZ_DEFAULTS (例: ) を介して適切な値に-T
またはを設定することにより、複数のコアを圧縮に利用できます。--threads
XZ_DEFAULTS="-T 0"
これは、5.1.0alpha バージョンの man のフラグメントです。
マルチスレッドの圧縮と圧縮解除はまだ実装されていないため、このオプションは現時点では効果がありません。
ただし、これは、スレッド化が有効な状態で圧縮されていないファイルの解凍には機能しません。バージョン 5.2.2 の男性から:
スレッド解凍はまだ実装されていません。ブロックヘッダーにサイズ情報を持つ複数のブロックを含むファイルでのみ機能します。マルチスレッド モードで圧縮されたすべてのファイルはこの条件を満たしますが、シングルスレッド モードで圧縮されたファイルは、 --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
-I
tar のスイッチのショートカットを使用して、複数のコアで bzip2 圧縮を--use-compress-program
呼び出すことができます。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 のルートが現在のディレクトリになるようにします。ディレクトリを変更するオプションを使用すると、ディレクトリのすべてのファイルが含まれるという-C
メリットが失われるため、このオプションを使用できないことに注意してください。find
-P
絶対パスを使用するように指示tar
するため、「メンバー名から先頭の `/' を削除しています」という警告はトリガーされません。--transform
とにかく先頭の「/」は削除されます。
-cf -
tar
後で指定する tarball 名を使用するよう指示します
{} +
find
以前に見つかったすべてのファイルを使用します
pigz
pigz -9 -p 4
必要な数のパラメーターを使用します。この場合-9
、 は圧縮レベルであり、圧縮-p 4
専用のコアの数です。負荷の高い Web サーバーでこれを実行する場合、利用可能なすべてのコアを使いたくないでしょう。
> myarchive.tar.gz
ついに。