현재 내가 만든 반복 가능한 환경의 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
-L1
parallel
연속된 데이터를 사용하여 프로그램을 실행하도록 지시합니다 . 공백에서 줄을 분리하고 세 가지 인수 집합을 얻습니다.
답변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개의 배치 두 개를 실행할 수 있습니다.
거품을 내고 헹구고 반복하세요.