有没有办法在 Snakemake 上对本地作业进行分组?
我正在尝试使用预取创建一个 Snakemake 管道,从 SRA 下载大量 fastq 文件并生成 bam 文件。尽管这是一个简单的问题,我可以对几个样本执行,但当我尝试在本地扩展时,我遇到了存储问题。当我尝试运行 100 个样本的管道时,它会尝试从规则 1 下载所有 fastq 文件,然后再使用以下规则进行处理。
我的管道将最终 bam 文件之前的所有步骤标记为临时,因此在分析所有内容并删除 fastq 文件后,存储不会成为问题。
如果我可以一次运行 10 个样本,在下载新的 fastq 文件之前删除临时输出,那就不会有问题了。
我尝试对作业进行分组并给snakemake 10个核心,认为它会下载10个样本并在到达第11个之前在整个管道中运行它们。但我意识到团体在本地不起作用并且不起作用。
我也尝试过管道来测试。我将预取规则的输出从“temporary()”更改为“pipe()”。通过管道预取到fasterq-dump可以在snakemake之外工作,但当我在snakemake上尝试时会输出“组中的错误...”,因为看起来fasterq-dump正在尝试在下载文件之前读取文件。
这是我用来测试此管道方法的snakemake代码的开始:
rule prefetch:
input:
output:
pipe(os.path.join(config['all_path']['sra_down'], "{srasample}/{srasample}.sra"))
wildcard_constraints: srasample="|".join(list(config['fastq_sra_HE'].values()))
params:
sraID="{srasample}",
srapath=expand(config["all_path"]["sra_down"])
shell: "prefetch {params.sraID} -O {params.srapath}"
rule fasterqdump:
input: os.path.join(config['all_path']['sra_down'], "{srasample}/{srasample}.sra")
output: r1=temporary(os.path.join(config['all_path']['sra_down'], "{srasample}_1.fastq")),
r2=temporary(os.path.join(config['all_path']['sra_down'], "{srasample}_2.fastq"))
wildcard_constraints: srasample="|".join(list(config['fastq_sra_HE'].values())), r=["1","2"]
params:
sraID=os.path.join(config['all_path']['sra_down'], "{srasample}"),
srapath=expand(config["all_path"]["sra_down"])
shell:
"fasterq-dump {params.sraID} -O {params.srapath}"
这是错误:
2024-11-21T16:14:51 fasterq-dump.2.11.3 err: invalid accession '/disco2/tiago/worldpops/SRR204016'
fasterq-dump quit with error code 3
[Thu Nov 21 13:14:52 2024]
Error in group ffb6a5f4-6dee-447e-9a2e-2dea42295399:
jobs:
rule fasterqdump:
jobid: 3
output: /disco2/tiago/worldpops/SRR204016_1.fastq, /disco2/tiago/worldpops/SRR204016_2.fastq
rule prefetch:
jobid: 4
output: /disco2/tiago/worldpops/SRR204016/SRR204016.sra (pipe)
Shutting down, this might take some time.
任何有关如何解决此问题的帮助将不胜感激。
最好的, 蒂亚戈
如果你的最终规则有更高的优先级,snakemake会尝试尽快执行它。因此,如果您有 10 个核心,并且每个规则仅需要一个核心,那么它应该就是您所寻找的。
免责声明:我还没有测试过,但根据我的理解,这应该可以解决问题。