Bashを使用してジョブを並列に実行する

Bashを使用してジョブを並列に実行する

このスクリプトを使用してデータを分析しています。

#!/bin/bash
inlist=/aut/cl/tera/mja/scripts
in=/aut/cl/tera/mja/data/ran_ready/
out=/aut/cl/tera/mja/data/mas/aft/
for i in $(cat $inlist/list.txt); do
echo "$i" 
mri_binarize --i ${in}/${i}/mri/aseg.mgz --o ${out}/${i}/masks/cc.nii.gz --match 41 42 43 44 45 
flirt -in ${out}/${i}/masks/cc.nii.gz -ref ${out}/${i}/T1.nii -out ${out}/${i}/masks/cc2T1.nii.gz -omat ${out}/${i}/masks/cc2T1.mat -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12  -interp trilinear

echo "$i ... done"    
wait
done

スクリプトは、list.txtに記載されている項目のリスト(50項目)から2つのコマンドラインを実行します。各項目について、スクリプトは操作を完了するのに30分かかります。次のコマンドを使用して、list.txtのすべてのエントリに対してこのスクリプトを同時に実行したいと思います。「xargs」または他の可能な方法もあります!

このスクリプトをどのように修正してより効率的にすることができますか?

ベストアンサー1

GNU Parallelがある場合は、次のことができます。

doit() {
  i=$1
  echo "$i" 
  mri_binarize --i ${in}/${i}/mri/aseg.mgz --o ${out}/${i}/masks/cc.nii.gz --match 41 42 43 44 45 
  flirt -in ${out}/${i}/masks/cc.nii.gz -ref ${out}/${i}/T1.nii -out ${out}/${i}/masks/cc2T1.nii.gz -omat ${out}/${i}/masks/cc2T1.mat -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12  -interp trilinear
  echo "$i ... done"
}
export -f doit

parallel doit :::: $inlist/list.txt

これにより、コアごとに1つのジョブが実行されます。

すべての新しいコンピュータにはマルチコアがありますが、ほとんどのプログラムは本質的にシリアルなので、マルチコアを使用しません。しかし、多くのタスクは非常に並列化可能です。

  • 複数のファイルで同じプログラムを実行する
  • ファイルの各行に対して同じプログラムを実行します。
  • ファイルの各ブロックに対して同じプログラムを実行します。

GNU Parallelは、同じコンピュータまたはSSHを介してアクセスできる複数のコンピュータでタスクを並列に簡単に実行できる汎用の並列ハンドラです。

4つのCPUで32の異なるジョブを実行する場合は、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。

簡単なスケジューリング

代わりに、GNU Parallel はタスクが完了すると新しいプロセスを作成し、CPU をアクティブに保つことで時間を節約します。

GNU並列スケジューリング

インストールする

ディストリビューションにGNU Parallelがパッケージされていない場合は、rootアクセスなしでプライベートインストールを実行できます。これは10秒で完了できます。

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

その他のインストールオプションについては、以下を参照してください。http://git.savannah.gnu.org/cgit/parallel.git/tree/README

詳細

より多くの例を見る:http://www.gnu.org/software/parallel/man.html

紹介ビデオを見る:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

このチュートリアルを見てください。http://www.gnu.org/software/parallel/parallel_tutorial.html

サポートを受けるには、メールリストに参加してください。https://lists.gnu.org/mailman/listinfo/parallel

おすすめ記事