다른 스크립트에서 호출한 스크립트의 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.
  • {1,2,3} {A,B}1,  2,  3및  5개 단어로 확장되었습니다 A . B
  • {1,2,3}{A,B}1A,  1B,  2A,  6개 단어로 확장 2B되었습니다  3A . 3B
  • {1,2,3}' '{A,B}1 A,  1 B,  2 A,  6개 단어로 확장 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'각 "단어"를 별도의 줄에 출력합니다. 하지만 기억하세요. 우리는 공백이 포함된 "단어"에 대해 이야기하고 있습니다. 결과는 한 줄에 2~3개의 일반(공백이 아닌) 단어를 인쇄하는 것입니다. 예를 들어,
    $ printf '%s\n' {1,2,3}' '{A,B}
    1 A
    1 B
    2 A
    2 B
    3 A
    3 B
    
    이 시점에서는 더 이상 참조되지 않는 일반 공간입니다.
  • -L1parallel연속된 데이터를 사용하여 프로그램을 실행하도록 지시합니다 . 공백에서 줄을 분리하고 세 가지 인수 집합을 얻습니다.

답변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?) 한 번에 6개의 배치 두 개를 실행할 수 있습니다.

거품을 내고 헹구고 반복하세요.

관련 정보