运行 R 代码在 shell 中并行,没有 R 文件
Run R code in parallel in a shell without having R file
我有以下 .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?
中的最后三行
您的批处理脚本仍应包含 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"
部分的引号
我有以下 .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?
中的最后三行您的批处理脚本仍应包含 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"
部分的引号