我的常规管道方式部分基于此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 个线程?
我是否应该担心 bwa 和 samtools 在我的常规管道方式中使用 24 个线程?
是的;如果只有 24 个线程可以在您的硬件上并行运行,则不可能(使用任何一种管道)运行 48 个线程并且比仅运行 24 个线程更高效。我看到的唯一区别是 Snakemake 告诉你这个,而 Unix 管道只是尽力而为。
如果您认为均匀划分线程可能在某种程度上效率低下(也许两个进程中的一个在文件的前半部分工作得更加努力,而另一个进程在文件的后半部分工作得更加努力)文件或类似的东西),您可能会考虑一次只运行一个并将中间结果写入磁盘。