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

时间:2018-06-16 20:10:45

标签: 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"

但似乎snakemake尝试在创建文件之前先计算这个,因为我收到了这个错误:

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

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

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

2 个答案:

答案 0 :(得分:0)

使用--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。

答案 1 :(得分:0)

如果您想根据问题按照规则动态执行此操作,您可以使用以下内容:

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

使用 input.size//1000000 的地方将输入文件的累积大小(以字节为单位)转换为 mb,尾随 10 可以是任意数字,具体取决于您的 shell/脚本要求。