Snakemake如何按批次跑完样本全流程后再执行下一批次任务
解决方案
你可以通过以下两种方式实现按100样本为批次分批运行,避免中间文件占用过高存储空间:
方式1:修改样本列表分批次提交(最稳妥,无需改现有规则逻辑)
你可以将2000个样本的列表SAMPLES拆成20个各含100样本的子列表,每次运行时指定当前批次的样本列表即可:
- 先将
SAMPLES变量的定义改为从外部配置文件读取,比如在config.yaml里加:
samples: - sample1 - sample2 # 每批次放100个,换批次时替换这个配置文件里的样本列表即可
- Snakefile里读取配置:
configfile: "config.yaml" SAMPLES = config["samples"]
- 每次运行正常执行
snakemake --cores 你的核心数即可,跑完一批换配置文件里的样本列表跑下一批,所有批次跑完后最终输出都在同一个目录下。
方式2:使用Snakemake原生分批参数(无需改配置,适合不想拆分样本的场景)
你之前测试batch参数没生效大概率是用法不对,Snakemake的--batch参数可以直接对通配符做分批,针对你的规则,按sample通配符分20批(每批100个),运行第n批的命令如下:
snakemake --batch sample=n/20 --cores 你的核心数
注意:n从1到20依次替换,跑完第1批再跑第2批即可,Snakemake会自动给
sample通配符对应的所有任务分组,每批只运行对应100个样本的全流程,上一批跑完的中间临时文件会自动删除,不会占用额外空间。
额外优化建议
如果你的流程里中间fastq文件已经标记为temp(),可以额外加上--delete-temp-output参数,强制跑完每个样本的全流程后立即清理该样本的所有临时文件,进一步节省空间:
snakemake --batch sample=1/20 --cores 你的核心数 --delete-temp-output
内容的提问来源于stack exchange,提问作者Al Bro
相关产品推荐
相关产品推荐

