Snakemake中的管道:如何在规则之间共享资源?

问题描述 投票:0回答:1

我的常规管道方式部分基于此Biostars帖子,如下:

rule map:
    input: "{sample}.fq.gz",
    output: "sort/{sample}.bam"
    threads: 24
    shell:
        """
bwa mem reference.fa {input} \
-t {threads} | \
samtools sort - \
-@ {threads} \
-o {output}
        """

我很想尝试 Snakemake 的管道,因为我希望它们可以使具有多个管道的工作流程更具可读性。

rule map:
    input: "{sample}.fq.gz",
    output: pipe("{sample}.bam")
    threads: 24
    shell:
        """
    bwa mem reference.fa {input} \
    -t {threads} \
    > {output}
        """

rule sort:
    input: "{sample}.bam"
    output: "sort/{sample}.bam"
    threads: 24
    shell:
        """
samtools sort {input} -@ {threads} -o {output}
        """

但是,这会导致以下结果

WorkflowError: Job needs threads=48 but only threads=24 are available. This is likely because two jobs are connected via a pipe and have to run simultaneously. Consider providing more resources (e.g. via --cores).

所以我必须在 bwa 和 samtools 之间划分线程,但是将线程分配给 samtools 意味着从 bwa 中删除线程,我不想这样做。在具有多个管道步骤的工作流程中,这个问题会变得更加明显。

我还没有看到 Snakemake 管道被如此频繁地使用,但我想知道是否有人知道解决方法?我也在考虑在 Snakemake 的 Github 页面上提出这个问题。


还有一个关于管道的一般问题。 Snakemake 是否有充分的理由为管道中的进程分配单独的线程?我是否应该担心 bwa 和 samtools 在我的常规管道方式中使用 24 个线程?

pipe snakemake
1个回答
0
投票

我是否应该担心 bwa 和 samtools 在我的常规管道方式中使用 24 个线程?

是的;如果只有 24 个线程可以在您的硬件上并行运行,则不可能(使用任何一种管道)运行 48 个线程并且比仅运行 24 个线程更高效。我看到的唯一区别是 Snakemake 告诉你这个,而 Unix 管道只是尽力而为。

如果您认为均匀划分线程可能在某种程度上效率低下(也许两个进程中的一个在文件的前半部分工作得更加努力,而另一个进程在文件的后半部分工作得更加努力)文件或类似的东西),您可能会考虑一次只运行一个并将中间结果写入磁盘。

© www.soinside.com 2019 - 2024. All rights reserved.