首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同时提交多份R工作?

如何同时提交多份R工作?
EN

Unix & Linux用户
提问于 2021-05-22 19:54:27
回答 1查看 1.3K关注 0票数 1

我有一个R脚本,它运行多个文件,比如file=1到50。我通常提交重复的工作,例如5次,每次10个文件,通过改变R-脚本中的数字。那么,我怎样才能一次提交5份工作而不提交5次呢?此外,我希望更新每个作业的<>default.out和错误文件

示例bash代码:

代码语言:javascript
复制
#!/bin/bash

#PBS -l nodes=1:ppn=20,walltime=05:00:00

#PBS -m e
#PBS -o default.out
#PBS -e errorfile

module load R/4.0

Rscript ~/r_script1.R
EN

回答 1

Unix & Linux用户

发布于 2021-05-23 02:55:53

您可以在qsub命令行中指定任何或所有这些选项,而不是将其指定为脚本中的#PBS ...注释。

例如,您的批处理脚本可以重写为:

代码语言:javascript
复制
qsub -l nodes=1:ppn=20,walltime=05:00:00 -m e -o default.out -e errorfile script.sh

对于qsub命令行上的所有选项,script.sh只需包含:

代码语言:javascript
复制
#!/bin/bash

module load R/4.0
Rscript ~/r_script1.R

您可以混合向qsub提供选项的两种方法。例如,您可以在命令行上提供-o-e选项,脚本中的其余部分作为#PBS注释:

代码语言:javascript
复制
$ qsub -o default.out -e errorfile script2.sh

script2.sh:

代码语言:javascript
复制
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e

module load R/4.0

Rscript ~/r_script1.R

然后,您可以将其与bash for循环结合起来:

代码语言:javascript
复制
for i in {1..5} ; do
  qsub -o "default.$i.out" -e "errorfile.$i" script2.sh
done

如果您需要将循环变量$i的值传递给脚本,这是可能的--但是有几种不同的实现方法,这取决于您使用的集群管理软件(例如slurm或torque或其他什么)。不管您使用的是哪个版本的qsub,使用qsub的-v选项都是最简单的,也可能是可用的。

例如,如果您需要在每个作业、r_script1.R、r_script2.R等中运行不同的R脚本,则可以使用-v i在脚本的环境中使用$i

代码语言:javascript
复制
for i in {1..5} ; do
  qsub -o "default.$i.out" -e "errorfile.$i" -v i script3.sh
done

script3.sh:

代码语言:javascript
复制
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e

module load R/4.0

Rscript ~/r_script"$i".R

qsub的某些实现允许将参数直接在命令行上传递给脚本,然后可以将其用作脚本中的正常位置参数($1、$2、$3等)。

大多数(全部?)qsub的实现还支持指定作业数组的-t选项。这可以在作业脚本中使用PBS_ARRAYID环境变量访问。例如:

代码语言:javascript
复制
qsub script4.sh

script4.sh (它使用shell重定向输出和错误文件,而不是qsub的-o-e选项):

代码语言:javascript
复制
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
#PBS -t 1-5

module load R/4.0

Rscript ~/r_script"$PBS_ARRAYID".R > "default.$PBS_ARRAYID.out" 2> "errorfile.$PBS_ARRAYID"

顺便说一句,PBS_ARRAYID是一个导出的环境变量,如果需要,可以在R脚本中使用Sys.getenv("PBS_ARRAYID")访问。例如,您可以使用它来构造输入和输出文件名,以及用于if/then/else决策来控制R脚本的操作。这将比拥有多个稍微不同版本的同一个R脚本更好。

注意:虽然我曾经管理运行torque和slurm的HPC集群,但从我这样做到现在已经有8年了。以上所有示例都是从内存(以及在internet上搜索qsub手册页)编写的,并且没有在实际的集群上进行测试。它们可能(可能会)需要一些更改才能工作,特别是使用$PBS_ARRAYID的最后一个示例--它们是关于如何实现您想做的事情的粗略示例。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/650937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档