Snakemake: Как динамически установить ресурс памяти в зависимости от размера входного файла

Я пытаюсь основать выделение памяти моего кластера для данного правила на размере входного файла. Возможно ли это в змейке и если да, то как?

До сих пор я пытался указать его в resource: раздел вроде так:

rule compute2:
    input: "input1.txt"
    output: "input2.txt"
    resources:
        mem_mb=lambda wildcards, input, attempt: int(os.path.getsize(str(input))/(1024*1024))
    shell: "touch input2.txt"

Но кажется, что Snakemake пытается вычислить это заранее, прежде чем файл будет создан, поскольку я получаю эту ошибку:

InputFunctionException in line 35 of test_snakemake/Snakefile:
FileNotFoundError: [Errno 2] No such file or directory: 'input1.txt'

Я запускаю свое змеиное мастерство с помощью следующей команды:

snakemake --verbose -j 10 --cluster-config cluster.json --cluster "sbatch -n {cluster.n} -t {cluster.time} --mem {resources.mem_mb}"

2 ответа

Если вы хотите сделать это динамически по правилу в соответствии с вопросом, вы можете использовать что-то в этом роде:

resources: mem_mb=lambda wildcards, input, attempt: (input.size//1000000) * attempt * 10

Где input.size//1000000используется преобразование совокупного размера входных файлов в байтах в мегабайты, а хвост 10может быть любым произвольным числом, основанным на специфике требований вашей оболочки/скрипта.

Это возможно с помощью --default-resourcesвариант. Как объясняется в справочной информации Snakemake:

В дополнение к простым целым числам разрешены выражения Python, превышающие размер ввода (например, '2*input.size_mb'). При указании этого без аргументов (--default-resources), он определяет'mem_mb=max(2*input.size_mb, 1000)''disk_mb=max(2*input.size_mb, 1000)', т.е. использование диска и памяти по умолчанию в два раза превышает размер входного файла, но не менее 1 ГБ.

Другие вопросы по тегам