Как установить лимиты привязки памяти в snakemake - PullRequest
3 голосов
/ 26 февраля 2020

Я бы хотел, чтобы Snakemake установил ограничения памяти для отдельных правил. Судя по документации snakemake, аргумент mem_mb выглядит так, как будто он будет работать, но задание использует больше памяти, чем я выделил.

Вот простое правило, которое использует несколько ГБ памяти. Я хотел бы, чтобы правило было остановлено, как только оно достигнет предела памяти, но оно завершится без проблем.

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 локально, а не с пакетным планировщиком или настройкой контейнера.

Ответы [ 2 ]

5 голосов
/ 26 февраля 2020

У меня нет абсолютно никакого опыта в этом, поэтому я не могу точно сказать, рекомендуется ли это или хорошо работает на разных платформах, но, похоже, это работает на моем компьютере (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
        """

См. здесь для получения дополнительной информации.

Я не верю, что SnakeMake предлагает решение "из коробки" для этого.

0 голосов
/ 29 февраля 2020

Я сам с этим не особо разбираюсь, но учтите, что использование директивы resources должно сопровождаться параметром командной строки --resources. В вашем случае вы можете выполнить:

snakemake -j 10 --resources mem_mb=500

, и это будет гарантировать, что задания, запущенные в одно и то же время, не превысят mem_mb = 500 (и одновременно будет выполнено не более 10 заданий). Однако правило с более чем mem_mb = 500 будет по-прежнему выполняться как одно задание. Чтобы предотвратить это, я думаю, что решение Maarten-vd-Sande - лучшее, что я могу придумать.

...