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 ГБ.