如何最好地将GNU并行用于使用大量CPU时间的作业

时间:2015-09-23 12:09:59

标签: parallel-processing gnu-parallel

我试图为我的ChIP-seq分析编写一个更有效的管道 - 在我发现GNU parallel(竖起大拇指)之后。

当我必须使用名为MACS2(https://github.com/taoliu/MACS/)的程序调用峰值时,我的脚本很长并进入瓶颈。

首先,Macs2有时会运行4个小时(实时),第二个在for循环中我运行7个Macs2调用,第三个我必须在包含10到100万行的47个文件中执行此操作。

最初我使用的是:

for item in ${data}; do macs2 callpeak (...) macs2 callpeak (...) macs2 callpeak (...) macs2 callpeak (...) macs2 callpeak (...) macs2 callpeak (...) macs2 callpeak (...) wait done

然而,由于每次通话的运行时间变化很大 - 这是因为效率不高!进一步硬编码运行的作业数量,如果n = 15则不启动更多...不是一个选项...因为我害怕颠覆集群!

我应该提一下,我正在开发一个有20个内核可用的集群,其中我只希望使用15个,每个只处理1个作业,只要有文件就不使用这15个内核。在我的小组中使用qsub启动Big作业也是正常的。 IS GNU与sub并行兼容,或者在使用并行时是后者冗余吗?

尝试使用GNU并行修改当前方法我很困惑我应该使用哪种方法:

  • 命令行调用所有文件并行传输,以便最多15个文件并行运行,其中macs2为每个文件一个接一个地运行? find . -name "*bam" | parallel -j 15 myscript.sh

  • 创建一个函数,然后在后续7个步骤中使用GNU parallel INSIDE脚本,如:

macs(){ macs2 callpeak (...) } export -f
1. parallel -j 15 macs {} ::: arg1 arg2 arg3 ... 2. parallel -j 15 macs {} ::: arg1 arg2 arg3 ... .. 7. parallel -j 15 macs2 {} ::: arg1 arg2 arg3 ...
其中arg1是文件列表,> arg1是macs2参数设置

此外,如果循环遍历所有文件,我不确定我是否更好用sem: parallel --semaphore --id pipeline1 -j 20 然而,使用这种方法我不知道如何将macs2程序和macs2的参数传递给并行,因为据我所知,似乎不需要-a :::和::::作为输入。

希望这样可以指导更好的方向 - 而且我让自己清楚了。

提前致谢&亲切的问候, 伊索尔德

1 个答案:

答案 0 :(得分:0)

parallel -j15 macs2 callpeak -t {} -c Control.bam -f BAM -g hs -n test -B -q 0.01 ::: *.bam