在shell中并行运行R代码而不使用R文件

时间:2018-05-05 11:56:43

标签: r slurm sbatch

我有以下.sh文件,可以使用sbatch在集群计算机上运行:

Shell.sh

#!/bin/bash
#
#SBATCH -p smp # partition (queue)
#SBATCH -N 2 # number of nodes
#SBATCH -n 2 # number of cores
#SBATCH --mem 2000 # memory pool for all cores
#SBATCH -t 5-0:00 # time (D-HH:MM)
#SBATCH -o out.out # STDOUT
#SBATCH -e err.err # STDERR

module load R
srun -N1 -n1 R CMD BATCH ./MyFile.R &
srun -N1 -n1 R CMD BATCH ./MyFile2.R &
wait

我的问题是MyFile.R和MyFile2.R几乎看起来一样:

MyFile.R

source("Experiment.R")
Experiment(args1) # some arguments

MyFile2.R

source("Experiment.R")
Experiment(args2) # some arguments

事实上,我需要为大约100个文件执行此操作。由于它们都加载了一些R文件,然后用不同的参数运行实验,我想知道是否可以在不为每次运行创建新文件的情况下执行此操作。我想并行运行所有进程,所以我不能只创建一个单独的R文件。

我的问题是:有没有办法直接从shell运行进程,每次运行都没有R文件?我可以这样做吗

srun -N1 -n1 R cmd BATCH 'source("Experiment.R"); Experiment(args1)' &
srun -N1 -n1 R cmd BATCH 'source("Experiment.R"); Experiment(args2)' &
wait

而不是 shell.sh 中的最后三行?

1 个答案:

答案 0 :(得分:1)

您的批处理脚本应该仍然包含2行来启动2个不同的R进程,但您可以使用相同的文件名在命令行上传递参数:

module load R
srun -N1 -n1 Rscript ./MyFile.R args1_1 args1_2 &
srun -N1 -n1 Rscript ./MyFile.R args2_1 args2_2 &
wait

然后在你的R档案中:

source("Experiment.R")
#Get aruments from the command line
argv <- commandArgs(TRUE)

# Check if the command line is not empty and convert values if needed
if (length(argv) > 0){
   nSim <- as.numeric( argv[1] )
   meanVal <- as.numeric( argv[2] ) 
} else {
   nSim=100  # some default values
   meanVal =5
}

Experiment(nSim, meanVal) # some arguments

如果您更喜欢使用R命令而不是Rscript,那么您的批处理脚本应如下所示:

module load R
srun -N1 -n1 R -q --slave --vanilla --args args1_1 args1_2 < myFile.R &
srun -N1 -n1 R -q --slave --vanilla --args args2_1 args2_2 < myFile.R &
wait

"R -q --slave ... < myFile.R"部分

可能需要(或不需要)引号