目前,我有以下脚本用于在我创建的可重复环境中的 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&
如何将这段代码更改为至少部分并行?是否值得做我试图将整个脚本合并到一个不同的脚本中,你可以在这里看到一个不同的问题吗 ?我会在性能上获得相当大的提升吗?
我没有
parallel
,而且我真的不明白你的脚本在做什么,所以我无法测试这个。但我相信这会奏效,并且可能是您正在寻找的风格。重写脚本以删除循环并获取参数:
然后像这样运行它: 让我带您了解一下:{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'
在单独的行上输出每个“单词”。但请记住,我们谈论的是带有空格的“单词”。效果是它每行打印两个或三个常规(非空白)单词。例如, 此时,这些是普通的空间;它们不再被引用。-L1
告诉parallel
你用一行的数据运行你的程序。它将在空格处分行,并获得一组三个参数。在第一个近似值上,当作业数 <= 内核数时,并行化才有意义。有 42 个内核可用吗?如果不是,那么一次并行所有作业可能没有意义。
这是并行工作的“天真”方式:
1)不要运行命令,写它们:
现在你有 7 个文本文件,每个文件有 6 个命令。您可以通过一个接一个地运行这 7 个脚本,以 6 个批次并行您的作业。如果您有足够的内核(16 个?),您可以一次运行两批 6 个。
起泡,冲洗,重复。