web-dev-qa-db-ja.com

並行してタールを塗る

職場の海洋学者の友人は、何ヶ月にもわたるデータをバックアップする必要があります。彼女は圧倒されているので、私はそれを自発的に申し出ました。バックアップするディレクトリは数百あり、それらをディレクトリと同じ名前のファイルにtar/bzipしたいとします。シリアルでこれを十分に簡単に行うことができますが、ワークステーションで数百のコアを利用したかったのです。

質問:-n-P argsまたはGNU Parallelでfindを使用して、ディレクトリをtar/bzipし、最終製品に名前を付けるときにできるだけ多くのコアを使用する方法:origonalDirName.tar.bz2

私はfindを使用して100個のファイルを同時にバンドルしましたが、非常に高速でした。したがって、各ファイル名を各ディレクトリのファイル名にする方法はわかりませんが、これが問題に取り組む方法です。

6
Peter

tarからstdoutにパイプして、pigzにパイプします。 (ほとんどの場合、ディスクアクセスを並列化する必要はなく、圧縮部分のみです。)

$ tar c- myDirectory/ | pigz > myDirectory.tar.gz

上記のような単純なtar呼び出しは、基本的に、ディレクトリツリーを可逆的に連結するだけです。この例のように、圧縮部分を分離することができます。

pigzはマルチスレッド圧縮を行います。使用するスレッドの数は-pで調整でき、デフォルトでは使用可能なコアの数になります。

6
PSkocik

pbzip2は非常にうまく機能します。上記の回答と同様に、tarをstdoutに、パイプをpbzip2に接続します。

$ tar -cf - mydir/ | pbzip2 > mydir.tar.bz2

pbzip2は、プロセッサの数、使用されるメモリの量、圧縮レベルなどを調整できる複数のオプションを受け入れます。

http://compression.ca/pbzip2/

または、ディレクトリごとに1つのアーカイブの場合(ディレクトリ名にスペースや特別な文字がないと想定):

for dir in * ; do 
     [[ ! -d ${dir} ]] && continue
     tar cf -  ${dir} | bzip2 > ${dir}.tar.bz2 &
done
1
DarkHeart

GNU Parallelでは、次のようになります。

parallel tar jcvf /tmp/{= s:/$:: =}.tar.bz2 {} ::: */

または:

parallel tar jcvf /tmp/{}.tar.bz2 {} ::: *

より良い圧縮のために試してください:

parallel tar -I pxz -cvf /tmp/{= s:/$:: =}.tar.xz {} ::: */
0
Ole Tange