使用便携式批处理系统 (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 解释器它可以用该命令替换自身,而不需要保留在内存中。
我正在尝试使用 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 解释器它可以用该命令替换自身,而不需要保留在内存中。