如何使用 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:本题与此高度相关
我有大量不同的 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:本题与此高度相关