デフォルトで並列bzip2とgzipを使用する最良の方法は何ですか?


41

Bzip2とgzipは1つのコアのみを使用しますが、多くのコンピューターには複数のコアがあります。しかし、lbzip2、pbzip2、pigsなどのプログラムがあり、利用可能なすべてのコアを使用し、bzip2およびgzipとの互換性を保証します。

デフォルトでこれらのプログラムを使用する最良の方法は何tar cfa file.tar.bz2 directoryですか?bzip2の代わりにlbzip2 / pbzip2 を使用しますか?もちろん、私は何も壊したくありません。


2
好奇心から:パラレルgzip / bzipはシリアルより本当に速いですか?私は、hddの書き込み速度とその他の制限がより問題であると想像します。
CON-F-使用

@ con-f-use理論的には、SSDがなければ、アーカイブの合計サイズが大きくなるほど高速になる可能性があります。
マルコセッピ

1
16 cpusのシステムで、gzipからpigzに切り替えると、tar 1.2TBまでの時間が短縮され、ネットワーク経由で転送され、18時間のバックアップと14時間のテストから4時間のバックアップと2時間のテストに結果がテストされます。多くの潜在的なボトルネック、ディスク速度、ネットワーク速度、処理能力がありますが、この場合、これは間違いなくIOバウンド以上のCPUバウンドでした。これはハイエンドシステムであり、結果は異なる場合があります。それが重要、これはRHEL6ではなかったこと
cs_alumnus

回答:


32

bzip2、bunzip2、bzcatをlbzip2に、gzip、gunzip、gzcat、zcatをpigzにシンボリックリンクできます。

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

/usr/share/doc/lbzip2/README.gzは/usr/share/doc/pbzip2/README.gzよりも「見栄えが良い」ので、pbzip2ではなくlbzip2を選択しました。また、tarマニュアルではlbzip2について説明しています。

編集:

Precise Pangolinに含まれているpigz-2.1.6は、不明なサフィックス(たとえば、initramfs-*。img)を持つファイルの解凍を拒否します。これは、Quantalに同梱されているpigz-2.2.4で修正されています。そのため、Quantal まで待つか、Quantal パッケージを手動でインストールするか、gunzip / gzcat / zcatをまだリンクしないでください。


7
これは、ほとんどの人の$ PATHで/ usr / local / bin /が/ bin /の前に来るため、うまく機能します。何かが/ bin / gunzipを直接呼び出すか、誰かが$ PATHに最初に/ binを持っている場合、それらはpigzを使用しません。それらに対しても同様に動作させるには、dpk-divertを使用して、すべてのバイナリに対してこのようなことを行うことができますがsudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzip、pigzはすべ​​てのgzipフラグと100%互換性がない可能性がありますので注意してください。
マークマッキンストリー

31

シンボリックリンクのアイデアは本当に素晴らしいです。
別の有効な解決策はエイリアスすることtarです:

alias tar='tar --use-compress-program=pbzip2'

またはそれぞれ

alias tar='tar --use-compress-program=pigz'

別の種類のデフォルトが作成されます。


追加の利点:元の機能を保持する場合(何らかの理由で)、「partar」などのエイリアスを使用できます。悲しいことに、perlの実装では「ptar」が使用されます
jena

13

シンボリックリンクの答えは本当に間違っています。システム全体でデフォルトのgzip(またはbzip2)をpigz(またはpbzip2)に置き換えます。並列実装は単一プロセスバージョンと非常に似ていますが、コマンドラインオプションの微妙な違いは、それらの違いに依存するコアシステムプロセスを破壊する可能性があります。

「--use-compress-program」オプションの方がはるかに良い選択です。2番目のオプション(エイリアスによく似ています)は、GNU tarでサポートされるTAR_OPTIONS環境変数を設定することです。

$ export TAR_OPTIONS = "-use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /

6
私は2011年からシンボリックリンクを使用していますが、破損は見られませんでした(編集で述べた場合を除く)。そして、そのような微妙な違いが見つからず、報告されない場合、非並列バージョンに永遠にこだわるでしょう。TAR_OPTIONS = "-use-compress-program = pbzip2"を使用する場合、bzip2とgzipを区別できるようには見えません。
elmicha

これはうまくいきませんでした。
デレクパーキンス

3

魅力的なオプションの1つは、デフォルトでマルチスレッドを使用するようにtarを再コンパイルすることです。このstackoverflowの回答からコピー

置換による再コンパイル

ソースから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

-2

〜/ .bash_aliasesで使用します。

alias gzip="pigz"
alias gunzip="unpigz"

1
これは、シェルのコマンドラインでgzip(またはgunzip)プログラムを直接呼び出す場合にのみ機能します。他のプログラム(などtar)は、その影響を受けません。
クリスチャンハドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.