为 snakemake 规则生成参数化数量的输出文件
Generating a parameterized number of outputfiles for a snakemake rule
我的工作流程需要在两个不同的集群上执行。第一个集群根据资源可用性将作业调度到节点。第二个集群为给定的作业保留整个节点,并要求其用户在其作业脚本中有效地使用这些多核。对于第二个集群,在后台提交较少数量的作业和堆栈进程是公认的做法。
举个小例子,假设我要创建四个文件:
SAMPLES = [1, 2, 3, 4]
rule all:
input:
expand("sample.{sample}", sample=SAMPLES)
rule normal_create_files:
input:
output:
expand("sample.{sample}", sample=SAMPLES)
shell:
"touch {output}"
这可以 运行 与每个样本一个作业并行。
除了四个作业各自创建一个文件之外,我还希望能够有两个作业各自创建两个文件。
我尝试了一些想法,但还没有取得太大进展。以下工作流程与上面的工作流程相同,只是它创建批次并在每个批次中将作业作为后台进程启动:
rule all:
input:
expand("sample.{sample}", sample=SAMPLES)
rule stacked_create_files:
input:
output:
"sample.{sample}"
run:
import subprocess as sp
def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i + n]
pids = []
for chunk in chunks({output}.pop(), 2):
for sample in chunk:
pids.append(sp.Popen(["touch", sample]))
exit_codes = [p.wait() for p in pids]
但是,这仍然创造了四个就业机会!
我还遇到了 Karel Brinda's response on the mailing list 相关主题。他指出了他自己的项目,他在 python 中创建了动态规则。接下来我会沿着这些方向尝试一些东西。
理想的解决方案是生成一组输出文件的单一规则,但能够批量生成这些文件。批次数将由配置参数设置。
这里有没有人遇到过类似的情况?任何想法或想法将不胜感激!
我认为您问题的真正解决方案是能够将 Snakemake 作业组合在一起。此功能目前处于规划阶段(事实上我有关于此的研究资助)。
确实,目前唯一的解决方案是以某种方式将其编码到规则本身(例如通过代码生成)。
将来,您将能够指定作业的 DAG 应该如何partitioned/grouped。每个生成的作业组都作为一批提交到集群。
我的工作流程需要在两个不同的集群上执行。第一个集群根据资源可用性将作业调度到节点。第二个集群为给定的作业保留整个节点,并要求其用户在其作业脚本中有效地使用这些多核。对于第二个集群,在后台提交较少数量的作业和堆栈进程是公认的做法。
举个小例子,假设我要创建四个文件:
SAMPLES = [1, 2, 3, 4]
rule all:
input:
expand("sample.{sample}", sample=SAMPLES)
rule normal_create_files:
input:
output:
expand("sample.{sample}", sample=SAMPLES)
shell:
"touch {output}"
这可以 运行 与每个样本一个作业并行。
除了四个作业各自创建一个文件之外,我还希望能够有两个作业各自创建两个文件。
我尝试了一些想法,但还没有取得太大进展。以下工作流程与上面的工作流程相同,只是它创建批次并在每个批次中将作业作为后台进程启动:
rule all:
input:
expand("sample.{sample}", sample=SAMPLES)
rule stacked_create_files:
input:
output:
"sample.{sample}"
run:
import subprocess as sp
def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i + n]
pids = []
for chunk in chunks({output}.pop(), 2):
for sample in chunk:
pids.append(sp.Popen(["touch", sample]))
exit_codes = [p.wait() for p in pids]
但是,这仍然创造了四个就业机会!
我还遇到了 Karel Brinda's response on the mailing list 相关主题。他指出了他自己的项目,他在 python 中创建了动态规则。接下来我会沿着这些方向尝试一些东西。
理想的解决方案是生成一组输出文件的单一规则,但能够批量生成这些文件。批次数将由配置参数设置。
这里有没有人遇到过类似的情况?任何想法或想法将不胜感激!
我认为您问题的真正解决方案是能够将 Snakemake 作业组合在一起。此功能目前处于规划阶段(事实上我有关于此的研究资助)。
确实,目前唯一的解决方案是以某种方式将其编码到规则本身(例如通过代码生成)。
将来,您将能够指定作业的 DAG 应该如何partitioned/grouped。每个生成的作业组都作为一批提交到集群。