在我的工作流程图中,我根据后缀合并了一个或多个输入文件。在给定后缀只有一个文件的情况下,合并操作很简单,可以在本地完成。如果要合并多个此类文件,则需要在群集上运行合并操作,并且需要数小时。
如果我提前知道所有输入文件,有没有办法指定/选择应该使用特定规则?换句话说,有没有办法根据规则的输入数量来表达规则优先级?
def _all_files_for_the_sample(wildcards):
# lookup all known files and return list
# of files matching wildcards.sample
...
# these two rules effectively have the same structure.
# I am omitting the implementation
rule super_fast_local_merge:
input: _all_files_for_the_sample
output: merged_{sample}.txt
...
rule super_slow_merge:
input: _all_files_for_the_sample
output: merged_{sample}.txt
...
现在,我还有一些规则可以对上述任一规则的输出进行计算。该手册提到,在链接多个规则链时,直接从规则全局引用符号更为有效(例如,说明rules.super_slow_merge.output
而不是在不同的规则中复制merged_{sample}.txt
。我被引导相信通过别名特定规则的输出,我将能够影响图形的形状:
def _choose_merged_file(wildcards):
all_inputs = _all_files_for_the_sample(wildcards.sample)
if len(all_inputs) <= 1:
# use trivial merge
return rules.super_fast_local_merge.output
else:
# fallback to slow merge
return rules.super_slow_merge.output
rule work_on_merged_data:
input: _choose_merged_file,
output: final_result_{sample}.txt
...
如果我在这里运行类似上面的内容,那么Snakemake抱怨规则含糊不清。有没有办法修改_choose_merged_file
输入函数来克服这个限制?是否有不同的方法来直接对我想要的规则进行别名?
注意:我已经设法通过使每个实现返回不同的文件名(例如merged_slow_{sample}.txt
和merged_trivial_{sample}.txt
)来获得一些工作,但这样做基本上会污染每个有效的规则合并数据与繁琐的输入函数
如果有人可以提供动态更改工作流程图的方法,那就太棒了。
答案 0 :(得分:1)
我很遗憾地说,目前没有合理的方法来实现这一目标。但是,在不久的将来会有一个解决方案,即作业分组功能。它将允许您基于通配符,输入文件等来决定是否应将一些连接的作业一起提交(到群集上的同一节点)。这样,您可以将快速合并作业与更长时间运行的内容组合在一起。