可以在
resources
指令中定义每个规则的内存要求
rule spades:
input:
rules.aRule.output
output:
"{sample}/spades/contigs.fasta"
resources:
mem_mb = 112000
shell:
"spades {input} {output}"
当涉及到可以通过命令行参数(例如 spades)直接指定内存要求的程序时,如上所述在
resources
指令中指定内存与使用spades
本身的命令行参数,即
rule spades_mem:
input:
rules.aRule.output
output:
"{sample}/spades/contigs.fasta"
params:
mem_spades = 112000
shell:
"spades -m {params.mem_spades} {input} {output}"
用两种方式指定内存可能不是一个好主意,即
rule spades_both:
input:
rules.aRule.output
output:
"{sample}/spades/contigs.fasta"
params:
mem_spades = 112000
resources:
mem_mb = 112000
shell:
"spades -m {params.mem_spades} {input} {output}"
但是,如果我这样做,哪一个优先,是来自二进制命令行(规则
spades_mem
)参数的那个,还是resources
指令中指定的那个(规则spades
)?
请求合适的计算节点时,
resources
将使用snakemake
指令。内存约束的命令行规范并不能保证指定的数量在计算节点上实际可用。
在
resources
和 params
中指定内存约束在某些情况下是有意义的。例如,如果应用程序贪婪并消耗所有可用内存,除非显式指定内存约束,则可能需要指定 params
以确保应用程序在本地运行时不会消耗所有内存。