我有一个非常简单的snakemake
管道,该管道接受一个输入文件,执行三个后续步骤来产生一个输出。每个单独的工作都非常快。现在,我想将此管道应用于SGE群集上的> 10k个文件。即使我使用group
每个输入文件中的每三个规则有一个作业,我仍然会提交超过1万个群集作业。有没有办法提交有限数量的集群作业(比如说100个)并在它们之间平均分配所有任务?
一个例子可能是
rule A:
input: {prefix}.start
output: {prefix}.A
group "mygroup"
rule B:
input: {prefix}.A
output: {prefix}.B
group "mygroup"
rule C:
input: {prefix}.B
output: {prefix}.C
group "mygroup"
rule runAll:
input: expand("{prefix}.C", prefix = VERY_MANY_PREFIXES)
然后运行
snakemake --cluster "qsub <some parameters>" runAll
答案 0 :(得分:0)
您可以使用for循环以同一规则处理所有10k文件(不确定这是否是Manavalan Gajapathy想到的)。例如:
rule A:
input:
txt= expand('{prefix}.start', prefix= PREFIXES),
output:
out= expand('{prefix}.A', prefix= PREFIXES),
run:
io= zip(input.txt, output.out)
for x in io:
shell('some_command %s %s' %(x[0], x[1]))
与规则B和C相同。
另请参阅snakemake local-rules
答案 1 :(得分:0)
我能想到的唯一解决方案是将规则A,B和C声明为本地规则,以便它们在主snakemake作业中运行,而不是作为作业提交。然后,您可以将runAll分为几批:
rule runAll1:
input: expand("{prefix}.C", prefix = VERY_MANY_PREFIXES[:1000])
rule runAll2:
input: expand("{prefix}.C", prefix = VERY_MANY_PREFIXES[1000:2000])
rule runAll3:
input: expand("{prefix}.C", prefix = VERY_MANY_PREFIXES[2000:3000])
...etc
然后,您为runAll1提交一个snakemake作业,为runAll2提交另一个,依此类推。您可以通过bash循环轻松地做到这一点:
for i in {1..10}; do sbatch [sbatch params] snakemake runAll$i; done;
比创建多个runAll规则更具可扩展性的另一个选择是拥有一个执行以下操作的辅助python脚本:
import subprocess
for i in range(0, len(VERY_MANY_PREFIXES), 1000):
subprocess.run(['sbatch', 'snakemake'] + ['{prefix}'.C for prefix in VERY_MANY_PREFIXES[i:i+1000]])