2017-08-09 3 views
2

Je suis nouveau sur SLURM. Je veux traiter une liste de fichiers assembled_reads/*.sorted.bam en parallèle. Avec le code ci-dessous, cependant, un seul processus est utilisé encore et encore.Comment traiter une liste de fichiers avec SLURM

#!/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 "," '$1=="$FILE"{print $4}' 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 
+0

Voir la réponse de damienfrancois ci-dessous. Vous pouvez probablement utiliser un script wrapper qui détermine le nombre de fichiers, puis soumet le script affiché dans sa réponse en utilisant le paramètre '--array' pour spécifier le nombre de fichiers déterminé dans votre script wrapper. –

Répondre

2

Vous créez un tableau de travaux mais vous ne l'utilisez pas. Vous devez remplacer la boucle for avec une indexation des fichiers sur la base du tableau d'emploi slurm id:

#!/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 
FILES=(assembled_reads/*.sorted.bam)  
FILE=${FILES[$SLURM_TASK_ARRAY_ID]} 

echo ${FILE} 
OUTFILE=$(basename ${FILE} .sorted.bam).raw.snps.indels.g.vcf 
PLDY=$(awk -F "," '$1=="$FILE"{print $4}' 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 

Assurez-vous d'adapter la valeur de --array être égal au nombre de dossiers à traiter.

+0

Wow. Je me souviens d'avoir utilisé des tableaux de travail LSF à quelques reprises et d'avoir à inclure des nombres consécutifs dans les noms de fichiers. C'est beaucoup plus flexible! –

+0

Avec ce même fichier est transmis comme entrée pour chaque itération. Je prends quelques jours pour que le travail termine la raison pour laquelle je réponds si tard – user1952312