我试图为我的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
其中arg1是文件列表,> arg1是macs2参数设置
1. parallel -j 15 macs {} ::: arg1 arg2 arg3 ...
2. parallel -j 15 macs {} ::: arg1 arg2 arg3 ...
..
7. parallel -j 15 macs2 {} ::: arg1 arg2 arg3 ...
此外,如果循环遍历所有文件,我不确定我是否更好用sem:
parallel --semaphore --id pipeline1 -j 20
然而,使用这种方法我不知道如何将macs2程序和macs2的参数传递给并行,因为据我所知,似乎不需要-a :::和::::作为输入。
希望这样可以指导更好的方向 - 而且我让自己清楚了。
提前致谢&亲切的问候, 伊索尔德
答案 0 :(得分:0)
parallel -j15 macs2 callpeak -t {} -c Control.bam -f BAM -g hs -n test -B -q 0.01 ::: *.bam