Запустить R-код параллельно в оболочке, не имея R-файла - PullRequest
0 голосов
/ 05 мая 2018

У меня есть следующий файл .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-файл.

У меня вопрос: есть ли способ запустить процесс непосредственно из оболочки, не имея 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 голосов
/ 05 мая 2018

Ваш пакетный скрипт должен по-прежнему содержать 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" part

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...