我尝试将给定规则的群集内存分配基于输入文件的文件大小。这可能是在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}"
答案 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/脚本要求。