【问题标题】:How to set binding memory limits in snakemake如何在snakemake中设置绑定内存限制
【发布时间】:2020-02-29 19:55:13
【问题描述】:

我想让 Snakemake 为各个规则设置绑定内存限制。根据snakemake 文档,mem_mb 参数似乎可行,但该作业使用的内存比我分配的要多。

这是一个使用数 GB 内存的简单规则。我希望规则在达到内存限制后停止,但它会毫无问题地完成。

rule:
    output:
        "a"
    threads: 1
    resources:
        mem_mb = 100
    shell:
        """
        python3 -c 'import numpy; x=numpy.ones(1_000_000_000)'
        touch a
        """

是否可以将此限制绑定?我想要一个可移植的、适用于 Windows 和 Linux 的解决方案。我在本地使用snakemake,而不是使用批处理调度程序或容器设置。

【问题讨论】:

  • snakemake 中的 "ressources" 与实际资源使用无关。它们是您分配给整个snakemake运行的任意值,并且snakemake不会同时运行该资源中的总数超过运行分配量的作业。

标签: snakemake


【解决方案1】:

我完全没有这方面的经验,所以我不能说这是否被推荐或跨平台运行良好,但这似乎适用于我的计算机(Ubuntu):

rule all:
    input:
        "a"

rule:
    output:
        "a"
    threads: 1
    resources:
        mem_mb = 100
    params:
        max_mem=lambda wildcards, resources: resources.mem_mb * 1024
    shell:
        """
        ulimit -v {params.max_mem}
        python3 -c 'import numpy; x=numpy.ones(1_000_000_000)'
        touch a
        """

请参阅here 了解更多信息。

我认为 SnakeMake 不会为此提供“开箱即用”的解决方案。

【讨论】:

  • 这对 Ubuntu 来说太棒了!如果有人对 Windows 有任何想法,请告诉我。
【解决方案2】:

我自己对此没有太多经验,但请注意resources 指令的使用应伴随命令行选项--resources。在您的情况下,您可以执行:

snakemake -j 10 --resources mem_mb=500

这将确保同时运行的作业不会超过 mem_mb = 500(并且最多同时运行 10 个作业)。但是,超过 mem_mb=500 的规则仍将作为单个作业运行。为了防止这种情况发生,我认为 Maarten-vd-Sande 的解决方案是我能想到的最好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2022-06-17
    • 2018-03-01
    相关资源
    最近更新 更多