目前,我有以下脚本,用于在我创建的可重复环境中的 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
和A
。B
{1,2,3}{A,B}
扩展为六个单词:1A
、1B
、2A
、2B
和3A
。3B
{1,2,3}' '{A,B}
扩展为六个单词:1 A
、1 B
、2 A
、2 B
和3 A
。3 B
请注意,这些“单词”包括空格。{1,2,3,4,5,6,7}' '{A,B,D}' '_part{1,2}
扩展为 42 (7×3×2) 个单词,每个单词包含两个空格。printf '%s\n'
在单独的行上输出每个“单词”。但请记住,我们谈论的是其中带有空格的“单词”。效果是每行打印两个或三个常规(非空白)单词。例如,
此时,这些都是普通空间;它们不再被引用。$ 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
现在您有 7 个文本文件,每个文件有 6 个命令。您可以通过逐个运行这 7 个脚本来并行处理 6 个批次的作业。如果您有足够的核心(16 个?),您可以一次运行两批,每批 6 个。
起泡沫,冲洗,重复。