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


225

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

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

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


上記のXiong Chiamiovによって提案されたソリューションは、うまく機能します。ラップトップを.tar.bz2でバックアップしたところ、CPUスレッドを1つだけ使用して132分かかりました。次に、ソースからtarをコンパイルしてインストールしました:gnu.org/software/tar構成ステップで述べたオプションを含めました:./ configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzipバックアップを再度実行したところ、32分しかかかりませんでした。それは4倍の改善よりも優れています!システムモニターを見ると、4つのCPUすべて(8スレッド)が常に100%で平坦化されていました。それが最良の解決策です。
ウォーレンセヴェリン

回答:


309

複数のコアでgzip圧縮を行うgzipの代わりにpigzを使用できます。-zオプションを使用する代わりに、それをpigzにパイプします。

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

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

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

3
どのようにpigzを使用して同じ方法で解凍しますか?それとも圧縮にのみ機能しますか?
user788171 2013

42
pigzは解凍に複数のコアを使用しますが、単一のコアに比べて改善は限られています。deflate形式は、並列解凍には適していません。解凍部分は逐次実行する必要があります。その他のpigz解凍用コアは、CRCの読み取り、書き込み、および計算に使用されます。一方、圧縮すると、pigzはn個のコアでn倍の改善に近づきます。
Mark Adler

7
ここのハイフンはstdoutです(このページを参照)。
Garrett

3
はい。両方向で100%互換性があります。
マークアドラー

4
実質的には、タールの計算に費やされるCPU時間がないので、あまり役に立ちません。tar形式は、ファイル間にヘッダーブロックがある入力ファイルの単なるコピーです。
Mark Adler、

324

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

たとえば、次のように使用します。

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 

21
これは知識の素晴らしい小さなナゲットであり、より多くの賛成意見に値します。私はこのオプションが存在することすら知らなかったし、何年にもわたってmanページを何度か読んだ。
Randall Hunt

2
@ValerioSchiavoni:ここではなく、4つのコアすべてでフルロードを取得します(Ubuntu 15.04 'Vivid')。
ボベンダー

8
私はtar - dir_to_zip | pv | pigz > tar.filepvが見積もりを助けるのを好む、あなたはそれをスキップすることができます。しかし、それでも書きやすく覚えやすいです。
Offenso 2017年

@ NathanS.Watson-Haighはいはい。プログラム名と引数を引用符で囲んでください。このman tarように、そう言う。
Marc.2377

1
2020年にzstdは、これを実行する最速のツールです。圧縮および解凍中の顕著なスピードアップ。tar -cf --use-compress-program=zstdmtマルチスレッドでこれを行うために使用します。
jadelord

112

共通のアプローチ

tarプログラムのオプションがあります:

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

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

最も一般的なマルチスレッドアーカイバは、(gzipの代わりに)pigzと(bzip2の代わりに)pbzip2です。例えば:

$ 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.0alphaバージョンの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

1
これは確かに最良の答えです。私は間違いなく私のタールを再構築します!

1
私はpbzip2mpibzip2を見つけました。mpibzip2は、クラスターや、たとえばラップトップとマルチコアデスクトップコンピューターがある場合に非常に有望に見えます。

これはすばらしい精巧な答えです。マルチスレッド圧縮(例:を使用pigz)は、ファイルから読み取るときにのみ有効になることに言及しておくとよいでしょう。STDINの処理は実際には遅くなる可能性があります。
oᴉɹǝɥɔ

3
xzオプションのプラス1 。これは最も単純でありながら効果的なアプローチです。
selurvedu 2016年

2
export XZ_DEFAULTS="-T 0"xz圧縮のtarオプション-Jを指定して呼び出す前は、魅力のように機能します。
scai 2018

13

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

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/

@MaximSuslovの回答に適したTL; DR 。
アインポクルム2017

これはtar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash

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の結果を使用して次のコマンドを実行しますfindtar

ステップ2: tar

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

--transform単純な文字列置換パラメーターです。アーカイブからファイルのパスを取り除き、解凍するとtarballのルートが現在のディレクトリになります。-Cディレクトリの変更オプションを使用できないことに注意してくださいfind。ディレクトリのすべてのファイルが含まれるため、次の利点が失われます。

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

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

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

ステップ3: pigz

pigz -9 -p 4

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

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

> myarchive.tar.gz

最後に。


0

検討した方がよい比較的新しい(解凍)圧縮ツールはzstandardです。予備のコアを使用するという優れた機能を備えており、圧縮率と(非)圧縮時間の関係で、いくつかの大きなトレードオフがありました。また、圧縮率のニーズに応じて、高度な調整が可能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.