Snakemake 内存限制

6

Snakemake 中,我有 5 条规则。对于每个规则,我通过 resources mem_mb 选项设置内存限制。

rule assembly:
     input:
         file1 = os.path.join(MAIN_DIR, "1.txt"), \
         file2 = os.path.join(MAIN_DIR, "2.txt"), \
         file3 = os.path.join(MAIN_DIR, "3.txt")
     output:
         foldr = dir, \
         file4 = os.path.join(dir, "A.png"), \
         file5 = os.path.join(dir, "A.tsv")
     resources:
         mem_mb=100000
     shell:
         " pythonscript.py -i {input.file1} -v {input.file2} -q {input.file3} --cores 5 -o {output.foldr}  "

我想通过类似以下方式来限制整个 Snakefile 的内存使用:

snakamake --snakefile mysnakefile_snakefile --resources mem_mb=100000

因此,并非所有工作都会使用每个100GB(如果我有5个规则,意味着500GB内存分配),但它们所有的执行都将最大化100GB(5个工作,总共100GB分配?)


你可能会对这个感兴趣:https://cr.yp.to/daemontools/softlimit.html - bli
1个回答

7
命令行参数设置了总限制。Snakemake调度程序将确保对于运行的作业集,mem_mb资源的总和不超过总限制。
我认为这正是您想要的,不是吗?您只需要在规则本身中设置每个作业预期的内存即可。请注意,Snakemake不会为您测量此值,您必须在规则中自行定义该值。例如,如果您希望作业使用100MB内存,请将mem_mb=100放入该规则中。

谢谢你的回答。是的,我想要限制所有作业的RAM消耗总量。我避免给作业单独设置限制,因为有一次它使用了6个线程并且分配了6次内存,因此给我带来了问题。 - bapors
目前,当我说'mem_mb=100'时,它为每个分配了'100mb',至少在dryrun中是这样看的。 - bapors
1
是的,这就是预定的方式。资源始终是每个作业的所有线程。如果您的内存使用量取决于线程数(这并不总是情况),您可以将资源定义为可调用的,例如,mem_mb=lambda wildcards, threads: 100 * threads - Johannes Köster
每个线程都会使用100mb的默认线程大小吗?还是需要在执行snakemake时使用-j命令来指定它? - bapors
我已经在命令行中使用mem_mb = 100000来运行它,以达到总使用量约为100GB的目标,但它超出了限制并达到了110GB的RAM使用量。你有任何想法为什么它没有保持在限制范围内吗? - bapors
@bapors Snakemake 不限制作业的 RAM 使用量。它假设作业公平竞争,并遵守声明的限制。 - abukaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接