職場の海洋学者の友人は、何ヶ月にもわたるデータをバックアップする必要があります。彼女は圧倒されているので、私はそれを自発的に申し出ました。バックアップするディレクトリは数百あり、それらをディレクトリと同じ名前のファイルにtar/bzipしたいとします。シリアルでこれを十分に簡単に行うことができますが、ワークステーションで数百のコアを利用したかったのです。
質問:-n
-P
argsまたはGNU Parallelでfindを使用して、ディレクトリをtar/bzipし、最終製品に名前を付けるときにできるだけ多くのコアを使用する方法:origonalDirName.tar.bz2
?
私はfindを使用して100個のファイルを同時にバンドルしましたが、非常に高速でした。したがって、各ファイル名を各ディレクトリのファイル名にする方法はわかりませんが、これが問題に取り組む方法です。
tar
からstdout
にパイプして、pigz
にパイプします。 (ほとんどの場合、ディスクアクセスを並列化する必要はなく、圧縮部分のみです。)
$ tar c- myDirectory/ | pigz > myDirectory.tar.gz
上記のような単純なtar
呼び出しは、基本的に、ディレクトリツリーを可逆的に連結するだけです。この例のように、圧縮部分を分離することができます。
pigz
はマルチスレッド圧縮を行います。使用するスレッドの数は-p
で調整でき、デフォルトでは使用可能なコアの数になります。
pbzip2は非常にうまく機能します。上記の回答と同様に、tarをstdoutに、パイプをpbzip2に接続します。
$ tar -cf - mydir/ | pbzip2 > mydir.tar.bz2
pbzip2は、プロセッサの数、使用されるメモリの量、圧縮レベルなどを調整できる複数のオプションを受け入れます。
または、ディレクトリごとに1つのアーカイブの場合(ディレクトリ名にスペースや特別な文字がないと想定):
for dir in * ; do
[[ ! -d ${dir} ]] && continue
tar cf - ${dir} | bzip2 > ${dir}.tar.bz2 &
done
GNU Parallelでは、次のようになります。
parallel tar jcvf /tmp/{= s:/$:: =}.tar.bz2 {} ::: */
または:
parallel tar jcvf /tmp/{}.tar.bz2 {} ::: *
より良い圧縮のために試してください:
parallel tar -I pxz -cvf /tmp/{= s:/$:: =}.tar.xz {} ::: */