【问题标题】:Snakemake memory limitingSnakemake 内存限制
【发布时间】:2021-08-10 19:34:53
【问题描述】:

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个作业,总共100 GB分配?)

【问题讨论】:

标签: memory resources snakemake


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。是的,我想总共限制所有作业的 RAM 消耗。我避免对作业设置单独的限制,因为有一次它使用了 6 个线程并使用了 6 次内存分配,因此给我带来了问题
  • 目前,当我说 'mem_mb=100' 时,它会为每个分配 '100mb',至少它在dryrun 中是这样的
  • 是的,这就是它的本意。资源总是针对该作业的所有线程的每个作业。如果您的内存使用取决于线程数(并非总是如此),您可以将资源定义为可调用的,例如,mem_mb=lambda wildcards, threads: 100 * threads
  • 这样每个线程都会使用100mb和默认线程大小?还是需要我在执行snakemake 时用-jcommand 指定它?
  • 我在命令行中使用 mem_mb=100000 运行它,目标总使用量约为 100GB,但是它超过了它并达到了 110GB 的 RAM 使用量。你知道为什么它没有留在极限?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 2014-07-16
  • 2011-02-25
  • 2012-01-04
  • 2017-11-29
  • 2016-12-21
  • 2011-07-11
相关资源
最近更新 更多