使用便携式批处理系统 (PBS) 阵列同时处理不同文件

Using Portable Batch System (PBS) Arrays To Work On Different Files Concurrently

我正在尝试使用 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/"`
#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 内部的 glob(不需要 ls)并将该 glob 的结果存储在数组中以供重用。
  • 数组是零索引的;因此,我们使用 0-4 而不是 1-5。
  • 使用命令替换 - `...`$(...) - 具有显着的性能开销,最好避免使用。
  • 对脚本中的最后一个命令使用 exec 告诉 shell 解释器它可以用该命令替换自身,而不需要保留在内存中。