Трубы в Snakemake: как разделить ресурсы между правилами? - PullRequest
1 голос
/ 29 мая 2020

Мой обычный способ прокладки трубок, частично основанный на этом сообщении 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 потока в моем обычном способе подключения?

...