首页 > 解决方案 > 处理并行化

问题描述

我对蛇形有点陌生。

想象一下,我有一条规则,如下所示(我已将线程数设置为 10)。

有没有什么办法可以snakemake神奇地处理这条规则中循环的并行化?

rule MY_RULE:
    input:
        input_file=TRAIN_DATA
    output:
        output_file=OUTPUT_DATA
    threads: 10
    run:        
        for f,o in zip(input.input_file, output.output_file):
            DO_SOMETHING_AND_SAVE(f,o)

谢谢

标签: snakemake

解决方案


我猜你的规则可以重写为(使用额外的代码来制作一个小的独立示例):

TRAIN_DATA = ['a.txt', 'b.txt', 'c.txt']
OUTPUT_DATA = ['a.out', 'b.out', 'c.out']

files= dict(zip(OUTPUT_DATA, TRAIN_DATA))

wildcard_constraints:
    x= '|'.join([re.escape(x) for x in OUTPUT_DATA])

rule all:
    input:
        expand('{x}', x= OUTPUT_DATA),

rule MY_RULE:
    input:
        input_file= lambda wc: files[wc.x]
    output:
        output_file= '{x}'
    run:        
        DO_SOMETHING_AND_SAVE(input.input_file, output.output_file)

这将为每个输入/输出对并行运行规则 MY_RULE。当然,细节取决于你在 MY_RULE 之前和之后到底想做什么......


推荐阅读