Parallel processing 如何最好地使用GNU并行处理占用大量CPU时间的作业

Parallel processing 如何最好地使用GNU并行处理占用大量CPU时间的作业,parallel-processing,gnu-parallel,Parallel Processing,Gnu Parallel,在我发现GNU并行(竖起大拇指)之后,我正试图为我的芯片序列分析编写一个更高效的管道 我的脚本很长,当我必须使用一个名为MACS2()的程序调用peaks时,它会进入瓶颈 首先,Macs2有时运行4小时(实时),第二次在for循环中我运行7个Macs2调用,第三次我必须在47个包含1000-1亿行的文件上执行此操作 最初,我使用的是: ${data}中项目的;做 macs2呼叫峰值(…) macs2呼叫峰值(…) macs2呼叫峰值(…) macs2呼叫峰值(…) macs2呼叫峰值(…) ma

在我发现GNU并行(竖起大拇指)之后,我正试图为我的芯片序列分析编写一个更高效的管道

我的脚本很长,当我必须使用一个名为MACS2()的程序调用peaks时,它会进入瓶颈

首先,Macs2有时运行4小时(实时),第二次在for循环中我运行7个Macs2调用,第三次我必须在47个包含1000-1亿行的文件上执行此操作

最初,我使用的是:

${data}中项目的
;做
macs2呼叫峰值(…)
macs2呼叫峰值(…)
macs2呼叫峰值(…)
macs2呼叫峰值(…)
macs2呼叫峰值(…)
macs2呼叫峰值(…)
macs2呼叫峰值(…)
等待
完成

然而,由于每个调用的运行时间变化很大,这当然不是有效的!如果n=15不是选项,则进一步硬编码正在运行且不启动更多作业的数量。。。因为我害怕打到集群

我应该提到的是,我正在一个拥有20个可用内核的集群上工作,其中我只希望使用15个,每个只处理1个作业,只要有文件,这15个内核中的任何一个都应该不用。在我的团队中,与qsub一起开展大型工作也是正常的。GNU并行是否与sub兼容,或者在使用并行时后者是冗余的

尝试使用GNU parallel修改当前方法时,我不知道应该使用哪种方法:

  • 命令行调用,所有文件通过管道并行运行,这样最多有15个文件并行运行,而macs2为每个文件逐个运行?
    find-名称“*bam”| parallel-j15 myscript.sh

  • 制作一个函数,然后在接下来的7个步骤中使用GNU并行内部脚本,如:

macs(){
macs2呼叫峰值(…)
}
导出-f
1.并行-j 15 MAC{}:::arg1 arg2 arg3。。。 2.并行-j 15 MAC{}:::arg1 arg2 arg3。。。 .. 7.并行-j 15 macs2{}:::arg1 arg2 arg3。。。
其中arg1是文件列表,>arg1是macs2参数设置

此外,如果在所有文件上循环,我不确定我是否更好地使用sem:
并行——信号量——id管道1-j 20
然而,使用这种方法,我不知道如何将macs2程序和macs2的参数并行传递,因为据我所知,它们似乎不以-a:::和:::作为输入

希望这样一个人能指引我走向更好的方向,我也希望我能把自己说清楚

提前感谢并致以亲切的问候,
伊索尔德

Hi-Ole。谢谢你的回复。因此,如果我在我的脚本中运行它(使用不同的参数、控制和输出设置),我可以对Mac进行7次后续调用。。其中,第一个将在47个文件处理完毕后完成,然后将运行第二个对Mac的调用等?谢谢你的帮助-谢谢。对不起。我不理解你的评论。我将推荐您浏览教程:man parallel_教程
parallel -j15 macs2 callpeak -t {} -c Control.bam -f BAM -g hs -n test -B -q 0.01 ::: *.bam