271

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

最近、ハイパースレッディングを備えたクアッド コア CPU を入手したので、8 つの論理コアがあり、圧縮/解凍中に多くのコアが使用されていないことに気付きました。

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

4

6 に答える 6

387

複数のコアで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
于 2012-09-07T14:48:01.827 に答える
138

一般的なアプローチ

プログラムのオプションがあります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 サポートについて。バージョン 5.2.0 以降の XZ Utils を実行している場合は、環境変数 XZ_DEFAULTS (例: ) を介して適切な値に-Tまたはを設定することにより、複数のコアを圧縮に利用できます。--threadsXZ_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
于 2014-12-18T07:31:10.160 に答える
14

-Itar のスイッチのショートカットを使用して、複数のコアで bzip2 圧縮を--use-compress-program呼び出すことができます。pbzip2

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
于 2014-09-01T15:02:27.647 に答える
1

ファイル名と圧縮オプションをより柔軟に使用したい場合は、次を使用できます。

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 のルートが現在のディレクトリになるようにします。ディレクトリを変更するオプションを使用すると、ディレクトリのすべてのファイルが含まれるという-Cメリットが失われるため、このオプションを使用できないことに注意してください。find

-P絶対パスを使用するように指示tarするため、「メンバー名から先頭の `/' を削除しています」という警告はトリガーされません。--transformとにかく先頭の「/」は削除されます。

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

{} +find以前に見つかったすべてのファイルを使用します

ステップ 3:pigz

pigz -9 -p 4

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

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

> myarchive.tar.gz

ついに。

于 2017-07-23T16:28:35.490 に答える