Snakemake:如何根据输入文件大小动态设置内存资源

KBo*_*hme 6 snakemake

我试图将给定规则的集群内存分配基于输入文件的文件大小。这在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"
Run Code Online (Sandbox Code Playgroud)

但似乎 Snakemake 尝试在创建文件之前预先计算此值,因为我收到此错误:

InputFunctionException in line 35 of test_snakemake/Snakefile:
FileNotFoundError: [Errno 2] No such file or directory: 'input1.txt'
Run Code Online (Sandbox Code Playgroud)

我使用以下命令运行我的snakemake:

snakemake --verbose -j 10 --cluster-config cluster.json --cluster "sbatch -n {cluster.n} -t {cluster.time} --mem {resources.mem_mb}"
Run Code Online (Sandbox Code Playgroud)

小智 1

使用该选项可以实现这一点--default-resources。正如 Snakemake 的 --help 信息中所解释的:

除了普通整数之外,还允许超过输入大小的 python 表达式(例如'2*input.size_mb')。当不带任何参数 ( --default-resources) 指定此项时,它定义 'mem_mb=max(2*input.size_mb, 1000)''disk_mb=max(2*input.size_mb, 1000)',即默认磁盘和内存使用量是输入文件大小的两倍,但至少为 1GB。