如何使用 SLURM 处理文件列表

How to process a list of files with SLURM

我是 SLURM 的新手。我想并行处理文件列表 assembled_reads/*.sorted.bam。使用下面的代码,但是一遍又一遍地只使用一个进程。

#!/bin/bash
#
#SBATCH --job-name=****
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=24
#SBATCH --partition=short
#SBATCH --time=12:00:00
#SBATCH --array=1-100
#SBATCH --mem-per-cpu=16000
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=****@***.edu
srun hostname

for FILE in assembled_reads/*.sorted.bam; do
  echo ${FILE}
  OUTFILE=$(basename ${FILE} .sorted.bam).raw.snps.indels.g.vcf
  PLDY=$(awk -F "," '=="$FILE"{print }' metadata.csv)
  PLDYNUM=$( [[$PLDY = "haploid" ]] && echo "1" || echo "2")

  srun java -Djava.io.tmpdir="tmp" -jar GenomeAnalysisTK.jar \
  -R scaffs_HAPSgracilaria92_50REF.fasta \
  -T HaplotypeCaller \
  -I ${${SLURM_ARRAY_TASK_ID}} \
  --emitRefConfidence GVCF \
  -ploidy $PLDYNUM \
  -nt 1 \
  -nct 24 \
  -o $OUTFILE
  sleep 1 # pause to be kind to the scheduler
done

您正在创建作业数组但未使用它。您应该使用基于 slurm 作业数组 id 的文件索引替换 for 循环:

#!/bin/bash
#
#SBATCH --job-name=****
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=24
#SBATCH --partition=short
#SBATCH --time=12:00:00
#SBATCH --array=0-99
#SBATCH --mem-per-cpu=16000
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=****@***.edu
srun hostname
FILES=(assembled_reads/*.sorted.bam)    
FILE=${FILES[$SLURM_ARRAY_TASK_ID]}

echo ${FILE}
OUTFILE=$(basename ${FILE} .sorted.bam).raw.snps.indels.g.vcf
PLDY=$(awk -F "," '=="$FILE"{print }' metadata.csv)
PLDYNUM=$( [[$PLDY = "haploid" ]] && echo "1" || echo "2")

srun java -Djava.io.tmpdir="tmp" -jar GenomeAnalysisTK.jar \
  -R scaffs_HAPSgracilaria92_50REF.fasta \
  -T HaplotypeCaller \
  -I ${${SLURM_ARRAY_TASK_ID}} \
  --emitRefConfidence GVCF \
  -ploidy $PLDYNUM \
  -nt 1 \
  -nct 24 \
  -o $OUTFILE

只需确保将 --array 的值调整为等于要处理的文件数。