如何在snakemake中逐个运行示例

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

我有一个 Snakemake 管道,它在 HPC 环境中运行内存非常密集的脚本。为了不阻塞 HPC,我想为每个样本一一运行这个脚本。

现在这就是我在规则中的内容,并且为每个样本同时调用脚本。

有没有一种解决方法可以为每个样本逐一调用脚本?

编辑添加 - 我在管道中还有其他规则,例如 fastqc,我可以毫无问题地在所有样本上一起运行。只是这一规则必须一次运行一个样本。

rule all:
expand(join(RESULTSDIR,"out","{sample}","aligned/inter.hic"),sample=SAMPLES),

rule call_script:
input:
        R1=join(RESULTSDIR,"out_trim","{sample}_trim.R1.fastq.gz"),
        R2=join(RESULTSDIR,"out_trim","{sample}_trim.R2.fastq.gz"), 
params: #all the parameters
output: 
        hic=join(RESULTSDIR,'out',"{sample}","aligned/inter.hic"),
shell:
         #call script - but script is called for each {sample} at the same time. 
Need this script to be called on one sample at a time

rule fastqc:
      # okay to run on all samples in parallel
snakemake
2个回答
1
投票

您可以指定规则所需的线程数。如果数量超过“--cores”提供的数量,则会按比例缩小。

因此,您可以将其设置为高于可用核心数量的值,确保在给定时间只有一个规则实例正在运行。

rule call_script:  
    threads: 100

0
投票

使用线程限制作业数量的一个问题是在 HPC 环境中,如果您开始使用调度程序,该规则将创建一个请求 100 个核心的作业。限制作业总数将限制您的其余作业。我认为最简单的方法是使用自定义资源来限制要运行的实例数量。我经常使用它来下载数据或创建巨大的临时文件。

rule call_script:
resources:
    script_limit=1

一个更好的名称可能会表明您限制执行的原因,例如大型中间文件。然后,当您执行时,您可以设置要一次运行的作业数量:

snakemake --resources script_limit=1

其他规则可以共享此资源(假设另一个规则也应该受到限制),并且您可以提出复杂的共享,也许一个规则是另一个规则的两倍“昂贵”,所以它

script_limit=2
。如果你想释放更多作业,可以在执行过程中修改
snakemake --resources script_limit=3

最后请注意,如果您未在命令行或配置文件上指定限制,则它实际上会被忽略。

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