Вопрос:

Использование массивов Portable Batch System (PBS) для одновременной работы с разными файлами

bash shell pbs

102 просмотра

1 ответ

31 Репутация автора

Я пытаюсь использовать массивы PBS для параллельной отправки 5 заданий с использованием одной и той же программы в разных файлах. PBS запустит пять разных копий скрипта, у каждого из которых будет целое число в PBS_ARRAYIDпеременной. Скрипт будет работать с:qsub script.pbs

Мой текущий код ниже; пока он работает как есть, он вычисляет список файлов несколько раз в каждом пакетном процессе. Есть ли более эффективный способ сделать это?

#PBS -S /bin/bash
#PBS -t 1-5       #Makes the $PBS_ARRAYID have the integer values 1-5
#PBS -V

workdir="/user/test"

samtools sort` `find ${workdir}/*.bam | sed ${PBS_ARRAYID}'!d'` > `find ${workdir}/*.bam | sed ${PBS_ARRAYID}'!d' | sed "s/.bam/.sorted.bam/"`
Автор: gdeniz Источник Размещён: 08.11.2017 11:12

Ответы (1)


1 плюс

194249 Репутация автора

Решение
#PBS -S /bin/bash
#PBS -t 0-4       #Makes the $PBS_ARRAYID have the integer values 0-4
#PBS -V

workdir="/user/test"

files=( "$workdir"/*.bam )       # Expand the glob, store it in an array
infile="${files[$PBS_ARRAYID]}"  # Pick one item from that array

exec samtools sort "$infile" >"${infile%.bam}.sorted.bam"

Примечание:

  • files=( "$workdir"/*.bam )выполняет внутренний глоб для bash (не lsтребуется) и сохраняет результаты этого глобуса в массиве для повторного использования.
  • Массивы индексируются нулем; таким образом, мы используем 0-4 вместо 1-5.
  • Использование подстановок команд - `...`или $(...)- приводит к значительному снижению производительности и его лучше избегать.
  • Использование execпоследней команды в сценарии говорит интерпретатору оболочки, что он может заменить себя этой командой, вместо того чтобы оставаться в памяти.
Автор: Charles Duffy Размещён: 09.11.2017 04:36
Вопросы из категории :
32x32