現在私が作成した繰り返し可能な環境のUnixシステムでHaploTypeCallerプログラムを使用するための次のスクリプトがあります。
#!/bin/bash
#parallel call SNPs with chromosomes by GATK
for i in 1 2 3 4 5 6 7
do
for o in A B D
do
for u in _part1 _part2
do
(gatk HaplotypeCaller \
-R /storage/ppl/wentao/GATK_R_index/genome.fa \
-I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
-L chr$i$o$u \
-O GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf &)
done
done
done
gatk HaplotypeCaller \
-R /storage/ppl/wentao/GATK_R_index/genome.fa \
-I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
-L chrUn \
-O GATK/HaplotypeCaller/HaploSample.chrUn.raw.vcf&
このコードを少なくとも部分的に並列に変更するにはどうすればよいですか?それだけの価値はありますか?スクリプト全体を別の質問で表示できる別のスクリプトにマージしようとしています。ここ すべきですか?私のパフォーマンスは大幅に向上しますか?
答え1
parallel echo HaploSample.chr{1}{2}{3}.raw.vcf ::: 1 2 3 4 5 6 7 ::: A B D ::: _part1 _part2
答え2
私はparallel
あなたのスクリプトの内容が何であるかをよく理解していないので、これをテストすることはできません。しかし、私はこれがうまくいき、あなたが探しているスタイルかもしれないと信じています。
ループを削除し、パラメータを受け入れるようにスクリプトを再構築します。
#!/bin/bash
#parallel call SNPs with chromosomes by GATK
(to be safe, verify that "$#" is 3)
i="$1"
o="$2"
u="$3"
(if you want, verify that the arguments are valid)
gatk HaplotypeCaller \
︙ \
-L "chr$i$o$u" \
-O "GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf" &
gatk HaplotypeCaller \
︙ \
-L chrUn -O GATK/HaplotypeCaller/HaploSample.chrUn.raw.vcf &
次に、次のように実行します。
printf '%s\n' {1,2,3,4,5,6,7}' '{A,B,D}' '_part{1,2} | parallel -L1 (your_script)
その内容をご案内いたします。
{1,2,3}
1
、2
との3つの単語に展開します3
。{1,2,3} {A,B}
1
、、、2
および3
5つの単語に拡張されましたA
。B
{1,2,3}{A,B}
1A
、、、、 6つの単語に拡張され1B
まし た 。2A
2B
3A
3B
{1,2,3}' '{A,B}
1 A
、、、、 6つの単語に拡張され1 B
まし た 。 これらの「単語」にはスペースが含まれています。2 A
2 B
3 A
3 B
{1,2,3,4,5,6,7}' '{A,B,D}' '_part{1,2}
それぞれ2つのスペースを含む42(7×3×2)の単語に展開されます。printf '%s\n'
各「単語」を別々の行に出力します。しかし、覚えておいてください。私たちはスペースを含む「単語」について話しています。結果は、1行に2〜3個の一般的な(空白ではない)単語を印刷することです。例えば、
この時点では、参照されなくなった一般的なスペースです。$ printf '%s\n' {1,2,3}' '{A,B} 1 A 1 B 2 A 2 B 3 A 3 B
-L1
parallel
連続したデータを使用してプログラムを実行するように指示します。スペースから行を分離し、3つの引数のセットを取得します。
答え3
#!/bin/bash
#parallel call SNPs with chromosomes by GATK
gatk_a_single() {
i="$1"
o="$2"
u="$3"
gatk HaplotypeCaller \
-R /storage/ppl/wentao/GATK_R_index/genome.fa \
-I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
-L chr$i$o$u \
-O GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf
}
export -f gatk_a_single
# This call does not fit the pattern of the others, so just run that in the background
gatk_a_single Un "" "" &
# Use 3 input sources: All combinations between all input sources will be generated and run
parallel gatk_a_single ::: 1 2 3 4 5 6 7 ::: A B D ::: _part1 _part2
# The parallel tasks are now complete
# Wait for the earlier backgrounded task to complete
wait
答え4
最初の近似では、並列性は、ジョブ数が<=コア数の場合にのみ意味があります。 42コアを使用できますか?そうでなければ、すべてのタスクを同時に並列化することは意味がありません。
並列に作業する「素朴な」方法は次のとおりです。
1) コマンドを実行せず、代わりに作成してください。
for i in 1 2 3 4 5 6 7
do
for o in A B D
do
for u in _part1 _part2
do
echo "gatk HaplotypeCaller \
-R /storage/ppl/wentao/GATK_R_index/genome.fa \
-I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
-L chr$i$o$u \
-O GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf &"
done
done > file-$i.sh
done
それぞれ6つのコマンドを含む7つのテキストファイルがあります。この7つのスクリプトを順番に実行すると、6つのジョブ配置を並列に処理できます。コアが十分であれば(16?)、一度に2つのバッチを実行できます。
泡立て、すすぎ、繰り返します。