在Snakefile中,可以在规则中指定关键字线程,优先级,资源。也可以将它们指定为params关键字中的子关键字。也可以将它们作为某些应用程序中的参数或选项放入外壳程序中。此外,如果将作业提交到集群,也可以在cluster-config中指定这些参数。 所以我对这些感到困惑。最佳做法是什么?这些规格放在哪里?如果将它们放在各处,那么哪个将在系统中有效。换句话说,哪个优先级更高?优先顺序是什么? 我知道一定有某些原因,我正在尝试理解它们。谢谢。
答案 0 :(得分:0)
我不确定集群配置,但对于一般的蛇形用法,在规则级别定义的用法与在params
部分中定义的用法不同。
我要说的是,最重要的区别是当决定运行哪些规则实例时,snakemake会忽略“ params
”部分中定义的内容,而它会使用在规则级别定义的内容来决定什么规则应该或可以在给定的时间执行。
您可以在params
节中定义所需的内容,这仅用于确定规则操作(取决于您自己在run
或{{1}中进行管理) }部分。
通过对比,您可以在规则级别定义固定的事物列表,例如shell
,threads
和ressources
,然后snakemake“知道”如何使用它们来确定应该执行什么规则。这些内容可能会对规则操作产生影响,也可能不会产生影响,具体取决于您是否以及如何使用它们。
使用规则级事物和priority
定义事物的方式不同,因为params
中定义的事物需要用作params
对象的属性(使用Python的点语法) )。可以直接使用在规则级别定义的params
。这避免了歧义。例如:
threads
使用“规则级” rule foo:
# [...]
params:
threads=8
threads:
4
shell:
"""my_command -j {params.threads} -p {threads} -i {input} -o {output}"""
避免运行过多的规则(考虑到使用threads
选项分配的“线程”总数)。
请注意,这实际上并不能阻止规则操作使用更多线程。这完全取决于您使用(或不使用)-j
变量的方式以及您使用的程序如何处理此参数。
规则级别threads
的作用类似。给定使用ressources
命令行选项提供的总金额时,snakemake在决定运行什么规则时会考虑它们。我不知道您是否可以在规则操作中使用它们,但是如果是这种情况,则可能与--resources
相同:实际效果将取决于所调用的程序以及它的方式被称为。
类似地,snakemake将使用规则级threads
来决定应运行哪些规则,但对规则操作没有影响(除非priority
或run
部分,您可以显式地使用它来控制所调用程序中的某些内容。
总结:
shell
定义的事物可以具有任何名称,其作用仅限于规则操作。效果取决于您在操作定义(params
或run
)中如何使用它们。shell
也可以在规则操作中起作用。需要进一步调查threads
或priority
的操作级别用法。