【问题标题】:snakemake batch creation of outputsnakemake 批量创建输出
【发布时间】:2020-04-06 23:07:00
【问题描述】:

根据 Snakemake 中更改的输入文件生成输出很容易:

rule all:
    input: [f'out_{i}.txt' for i in range(10)]
rule make_input:
    output: 'in_{i}.txt'
    shell: 'touch {output}'
rule make_output_parallel:
    input: 'in_{i}.txt'
    output: 'out_{i}.txt'
    shell: 'touch {output}'

在这种情况下,make_output 只会在 in_{i}.txt 发生变化的情况下运行。

但假设 'out_{i}.txt' 不能并行生成,我想一步生成它们,例如,

rule make_output_one_step:
    input: [f'in_{i}.txt' for i in range(10)]
    output: [f'out_{i}.txt' for i in range(10)]
    shell: 'touch {output}'

如果只有一个 in_{i}.txt 文件发生了变化,我不需要重新生成全部 10 个。 如何调整make_output_one_step.output 以仅生成需要的文件?

【问题讨论】:

  • make_outputall 都不依赖于任何 in_{i}.txt 文件。您的脚本中没有“根据更改的输入文件生成输出”。
  • 哎呀,你是对的。进行了编辑以使其更清晰。
  • 你的意图不明确。首先,make_output 中的脚本实际上并不依赖于输入。接下来,make_input 生成完全相同的文件,因此事实上的时间戳并不重要。最后,我没有看到您打算“一步生成它们”的任何理由。我看到了一个逻辑谬误。
  • 您可以设置最大并行资源。
  • @DmitryKuzminov,这只是一个简单的例子,而不是我的用例。我不知道你指的是什么“逻辑谬误”——你能澄清一下吗?

标签: snakemake


【解决方案1】:

如果您希望管道的某些部分因任何原因(RAM、互联网使用、IO、API 限制等)不能并行工作,您可以使用resources

rule all:
    input: [f'out_{i}.txt' for i in range(10)]

rule make_input:
    output: 'in_{i}.txt'
    shell: 'touch {output}'

rule make_output:
    input: 'in_{i}.txt'
    output: 'out_{i}.txt'
    resources: max_parallel=1
    shell: 'touch {output}'

然后您可以像snakemake --resources max_parallel=1 --cores 10 一样调用您的管道。在这种情况下,规则make_input 的所有作业将并行运行,但make_output 的一个实例将并行运行。

【讨论】:

  • 谢谢。听起来这是防止规则并行运行的有效方法。它仍然需要 make_output 被调用 10 次而不是一步,这是我更喜欢的,但也许这是 Snakemake 可以实现的最佳解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2021-01-17
  • 1970-01-01
相关资源
最近更新 更多