Memory 蛇形存储器限制

Memory 蛇形存储器限制,memory,resources,snakemake,Memory,Resources,Snakemake,在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")

在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}  "
但我想做的是限制整个Snake文件的内存使用:

snakamake --snakefile mysnakefile_snakefile --resources mem_mb=100000

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

命令行参数设置总限制。Snakemake调度程序将确保对于正在运行的作业集,
mem_mb
资源的总和不会超过总限制


我想这正是你想要的,不是吗?您只需要在规则本身中设置每个作业的预期内存。请注意,Snakemake不会为您测量此值。您必须在规则中自己定义该值。例如,如果您希望您的工作使用100MB内存,请将
mem_mb=100
放入该规则。

谢谢您的回答。是的,我想限制所有作业的RAM消耗总量。我避免对作业设置单独的限制,因为有一次它使用了6个线程,并且使用了6次内存分配,因此造成了问题。当我说“mem_mb=100”时,它为每个作业分配了“100mb”,至少在Dryrun中是这样的是的,这就是它的本意。资源始终是每个作业在该作业的所有线程上的资源。如果内存使用情况取决于线程数(情况并非总是如此),则可以将资源定义为可调用的,例如,
mem_mb=lambda通配符,threads:100*threads
。这样每个线程将使用默认线程大小的
100mb
?或者它需要我在执行snakemake时使用
-j
命令来指定它吗?我在命令行中使用mem_mb=100000运行它,目标总使用量为~100GB,但是它超过了它,RAM使用量达到了110GB。。你知道为什么它没有保持在极限吗?你可能对此感兴趣: