並列コーキング

並列コーキング

海洋学者の友人は職場で数ヶ月間のデータをバックアップする必要があります。彼女はあまりにも大変だったので、資源した。バックアップするディレクトリが何百ものあり、ディレクトリと同じ名前のファイルにtar / bzipで圧縮しようとしています。これは順番に簡単に実行できますが、私のワークステーションにある何百ものコアを活用したいと思います。

質問:findと-n -PargsまたはGNU Parallelを使用して最終製品に名前を付けるときに、できるだけ多くのコアを使用するためにディレクトリをtar / bzipに圧縮するにはどうすればよいですか origonalDirName.tar.bz2

私はfindを使用して同時に100個のファイルを圧縮しており、非常に高速です。各ファイル名を各ディレクトリのファイル名にする方法はわかりませんが、これは問題の解決策です。

答え1

ただtarパイプstdoutで接続するだけですpigz。 (ディスクアクセスを並列化するのではなく、圧縮部分のみを並列化したい可能性が高いです。)

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

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

pigzマルチスレッド圧縮を実行します。使用するスレッドの数は調整でき-p、デフォルトは使用可能なコアの数です。詳細については、以下で確認できます。Pigz githubリポジトリ

答え2

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

答え3

GNU Parallelを使用すると、次のようになります。

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

または:

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

より良い圧縮のために、以下を試してください。

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

s:/$::Perl式です。結末をなくした/

関連情報