如何使用 slurm 并行化这个 for 循环?

How to parallelize this for loop using slurm?

我有大量不同的 bam 文件要处理,这是我的 sbatch 文件:

#! /bin/bash
#
#SBATCH --job-name=test
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=4000
#SBATCH --output=output.%j.out
#SBATCH --error=output.%j.err

srun picard.sh

我的意思是 运行 使用 threads=2

还有我的 picard.sh 文件:

#!/bin/bash

module load picard-tools/2.4.1-gcb01
module load java/1.8.0_45-fasrc01

picard=./picard-tools/2.4.1-gcb01/picard.jar
outdir=./bam2fastq/fastq
tmpdir=./tmp/

for bam in $(find . -type f -name \*.bam);
do
    echo "processing ${bam}"
    s=${bam##*/}
    r1=${s%.bam}_R1.fastq
    r2=${s%.bam}_R2.fastq
    echo $r1
    echo $r2
    java -Djava.io.tmpdir=${tmpdir} -Xmx8G -jar ${picard} SamToFastq \
        I=${bam} \
        FASTQ=${outdir}/${r1} \
        SECOND_END_FASTQ=${outdir}/${r2}
done

虽然这将处理线程=2 的每个 bam,但它将一个接一个地处理。我怎么能运行 并行处理 6 个 bam 文件与 thread=2 同时处理?

您能否尝试将您的 for 循环放入一个函数中,将您的输入文件放入一个数组中并启动作业数组。类似于:

#!/bin/bash
#
#SBATCH --job-name=test
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=4000
#SBATCH --output=array_%A_%a.out
#SBATCH --error=array_%A_%a.err
#SBATCH --array=0-5


#Loading modules and variables
module load picard-tools/2.4.1-gcb01
module load java/1.8.0_45-fasrc01

picard=./picard-tools/2.4.1-gcb01/picard.jar
outdir=./bam2fastq/fastq
tmpdir=./tmp/

#Array of my inputs
INPUT=( $(find . -type f -name \*.bam) )

#my function
func () {
    bam=
    echo "processing ${bam}"
    s=${bam##*/}
    r1=${s%.bam}_R1.fastq
    r2=${s%.bam}_R2.fastq
    echo $r1
    echo $r2
    java -Djava.io.tmpdir=${tmpdir} -Xmx8G -jar ${picard} SamToFastq \
        I=${bam} \
        FASTQ=${outdir}/${r1} \
        SECOND_END_FASTQ=${outdir}/${r2}
}

#launch job arrays
func "${INPUT[$SLURM_ARRAY_TASK_ID]}"

注意 1:您还可以限制并行进程的数量 运行,以防您获得更多进程:

#SBATCH --array=0-1000%100

在此示例中,您将同时将此作业数组中 运行 个任务的数量限制为 100。

注2:本题与此高度相关

注3:Slurm doc for job arrays