他のスクリプトから呼び出されたスクリプトのforループをGNUパラレルコマンドに変換する

他のスクリプトから呼び出されたスクリプトのforループをGNUパラレルコマンドに変換する

現在私が作成した繰り返し可能な環境の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および  35つの単語に拡張されましたA 。 B
  • {1,2,3}{A,B}1A、、、、  6つの単語に拡張され 1Bまし  た   。 2A2B3A3B
  • {1,2,3}' '{A,B}1 A、、、、  6つの単語に拡張され 1 Bまし  た   。  これらの「単語」にはスペースが含まれています。2 A2 B3 A3 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
    
    この時点では、参照されなくなった一般的なスペースです。
  • -L1parallel連続したデータを使用してプログラムを実行するように指示します。スペースから行を分離し、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つのバッチを実行できます。

泡立て、すすぎ、繰り返します。

関連情報