如何解决Snakemake:先创建一个目标输出,然后再进行分叉工作流中的下一个
假设您有一个带有通配符(以下示例中的 wc
)的工作流,并且您希望针对该通配符的大量不同值(例如 1000 个样本)运行它。通常,我会创建一个 rule all
,它接受一个生成 1000 个文件名的函数的输入。但我发现 Snakemake 将执行 one
1000 次,然后 two
1000 次。如果 two
生成的中间文件非常大,这将是有问题的,因为您最终会得到 1000 个巨大的文件。
相反,我希望 Snakemake 产生 five_1.txt
... five_1000.txt
,确保它实际产生 rule all
的一个输出,然后再进入下一个。这样,temp()
会在生成下一个之前删除一个 three_{wc}.txt
,并且您最终不会得到大量大文件。
在线性工作流中,您可以按照@Maarten-vd-Sande 的建议使用优先级。这是因为 Snakemake 会查看它可以执行的作业,并选择最高优先级,这将始终是线性工作流中链下游的优先级。然而,在分叉中,这不起作用,因为分叉的两侧需要具有相同的优先级,但随后 Snakemake 只会先执行所有规则。
rule one:
input: "input_{wc}.txt"
output:
touch("one_{wc}.txt"),touch("two_{wc}.txt")
rule two:
input: "one_{wc}.txt"
output: temp(touch("three_{wc}.txt"))
rule three:
input: "two_{wc}.txt"
output: touch("four_{wc}.txt")
rule four:
input:
"three_{wc}.txt","four_{wc}.txt"
output: "five_{wc}.txt"
shell:
"""
touch {output}
"""
解决方法
如果它是叉子,就让它不是叉子。 two
必须在 three
之前执行。使用@Maarten-vd-Sande 的解决方案。
rule one:
input: "input_{wc}.txt"
output:
touch("one_{wc}.txt"),touch("two_{wc}.txt")
rule two:
input: "one_{wc}.txt"
output: temp(touch("three_{wc}.txt"))
priority: 1
rule three:
input:
"two_{wc}.txt","one_{wc}.txt"
output: touch("four_{wc}.txt")
priority: 2
rule four:
input:
"three_{wc}.txt","four_{wc}.txt"
output: touch("five_{wc}.txt")
priority: 3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。