Snakemake repeat benchmark运行异常:重复测量值偏小
Snakemake benchmark repeat 仅首次运行有效问题的解决办法
问题原因
你的repeat()用法本身没问题,但Snakemake的核心执行逻辑是检查输出文件是否存在,存在则跳过任务。第一次运行后,规则定义的.C、.R、.log输出文件已经生成,后续两次repeat迭代会直接判定任务已完成,跳过实际脚本执行,所以只记录了空跑的耗时和内存数据。
解决办法
1. 脚本内强制清理输出文件(推荐)
修改规则的shell脚本,在执行前删除当前规则的所有输出文件,确保每次repeat都能完整执行:
rule br: # 其他字段保持不变 shell: """ module load gcc # 清理本次运行的输出文件,保证每次repeat都重新执行 rm -f {output.C} {output.R} {output.log} {input.script} {params.outprefix} -t {threads} """
2. 标记输出为临时文件(仅适合无需保留输出的场景)
将输出文件用temp()包裹,Snakemake会在每次repeat完成后自动删除输出,下次迭代就会重新执行任务:
output: C = temp("output/br/{prefix}/{ref}/{prefix}.{ref}.br.C"), R = temp("output/br/{prefix}/{ref}/{prefix}.{ref}.br.R"), log = temp("output/br/{prefix}/{ref}/{prefix}.{ref}.br.log")
⚠️ 注意:这个方法会在所有repeat完成后删除输出文件,如果后续流程需要依赖这些文件,不要用这个方案。
3. 启动时添加强制重跑参数
运行Snakemake时加上--rerun-incomplete参数,强制所有规则即使输出存在也重新执行,适合专门跑benchmark的场景:
snakemake --rerun-incomplete --cores 32
验证效果
修改后重新运行,benchmark文件的三次记录应该都会显示正常的耗时、内存等数据,不会再出现极小值。
内容的提问来源于stack exchange,提问作者rvarki
相关产品推荐
相关产品推荐

