пакетное создание змейка - PullRequest
0 голосов
/ 27 марта 2020

Создать вывод на основе измененных входных файлов в 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, чтобы генерировать только необходимые файлы?

1 Ответ

1 голос
/ 31 марта 2020

Если вы хотите, чтобы некоторые части конвейера по какой-либо причине не работали параллельно (ОЗУ, использование целых rnet, IO, ограничение API и т. Д. c ....), вы можете использовать ресурсы .

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.

...