如何在Snakemake中固定限制磁盘使用量避免磁盘空间不足?
Snakemake 磁盘资源限制不生效的解决方法
核心原因
Snakemake的disk_mb是用户声明式的资源调度参数,不会自动探测任务实际磁盘占用,调度时只会累加所有运行中任务手动填写的disk_mb值,和实际磁盘使用量无直接关联。当前配置存在三个核心问题:
- 单任务
disk_mb估值严重偏低:每个规则设置100GB磁盘配额,但单份150GB的压缩fastq解压为未压缩格式后可达400~600GB,远高于声明的100GB,调度器对单任务占用的计算完全失真。 - 未计算临时文件的重叠占用:标记为
temp()的文件默认会在所有依赖它的下游任务全部运行成功后才会删除,上下游任务运行期间会同时存在输入、输出两份文件,仅为单步骤设置100GB、不计算双份文件的重叠占用,实际磁盘峰值会直接翻倍。 - 跨任务并行逻辑突破限制:总配额500GB、单任务100GB的配置会让调度器同时启动5个任务,可能出现多个样本的merge步骤同时运行、或同一样本上下游步骤同时占盘的情况,总实际占用直接突破阈值。
可落地的严格限容方案
1. 先准确核算单任务峰值磁盘占用
不要拍脑袋填写disk_mb,按以下逻辑计算单规则的峰值占用:
- 压缩格式fastq(.fq.gz/.fastq.gz)的解压后大小通常是压缩包的2.5~4倍,按保守3倍计算
- 单规则峰值磁盘 = 工作目录内的输入文件大小 + 输出文件大小 + 工具运行产生的临时缓存(通常为输出大小的10%~20%)
- 如果依赖Snakemake默认的temp自动删除逻辑,要按2倍输出文件大小计算重叠期占用
注意:如果核算下来单样本未压缩中间文件的峰值已经超过500GB,必须采用下文提到的压缩中间文件方案,否则即使只跑1个任务也会耗尽磁盘。
2. 用准确的资源值强制限制并行度
核算完单任务峰值后,直接按总磁盘容量倒推最大并行数,不要留冗余:
- 如果单样本全流程峰值占用450GB,直接给每个写大文件的规则设置
disk_mb=450000,全局启动参数设置--resources disk_mb=450000,调度器同一时间只会运行1个大IO任务,绝对不会突破500GB上限。 - 如果把中间文件改成压缩格式后单样本峰值降到150GB,就设置单任务
disk_mb=150000,全局--resources disk_mb=450000,同时跑3个样本也不会超500GB。
3. 主动删除临时文件减少重叠占用
不要完全等Snakemake自动删除temp文件,可以在下游任务的shell命令末尾主动删除已经用完的上游输入,把重叠占用窗口降到0:
rule filter: input: "{sample}.assembled.fastq" output: temp("{sample}.assembled.filtered.fastq") resources: disk_mb=450000 # 替换为核算后的准确值 shell: """ filter-tool {input} {output} rm -f {input} # 输出写完立刻删上游临时文件,不等调度 """
也可以在启动snakemake时加--temp-delete-delay 0参数(Snakemake 7.0+版本支持),让temp文件在没有任何运行中任务依赖时立刻删除。
4. 从根源降低磁盘占用:中间文件全用压缩格式
这是效率最高的方案,绝大多数生信工具都支持读写gzip压缩的fastq文件,把中间输出从无压缩fastq改成gz压缩格式,文件大小直接降到原来的1/3,不需要刻意压低并行度也不会超磁盘:
rule merge: input: fw="{sample}_1.fq.gz", rv="{sample}_2.fq.gz", output: temp("{sample}.assembled.fastq.gz") # 输出直接写压缩格式 resources: disk_mb=150000 # 压缩后单任务占用直接降到150GB threads: 16 shell: """ # 如果工具不直接支持输出压缩,用管道接gzip压缩,省掉中间无压缩文件 merger-tool -f {input.fw} -r {input.rv} -o /dev/stdout | gzip -1 > {output} """
当前命令的修正示例
如果暂时不修改中间文件格式,按单样本450GB峰值核算,启动命令改成:
snakemake --resources disk_mb=450000 --use-conda --cores 16 -p --temp-delete-delay 0
对应规则里的disk_mb全部替换为核算后的准确值,即可严格把总磁盘占用控制在500GB以内。
内容的提问来源于stack exchange,提问作者Peter Pisher
相关产品推荐
相关产品推荐

