このスクリプトを使用してデータを分析しています。
#!/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 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