同时运行多个R脚本

时间:2015-06-30 12:06:03

标签: r rstudio

在我的论文中,我需要进行大量的模拟研究,这些研究都需要很长时间。我的计算机有4个内核,所以我一直想知道是否可以同时在Rstudio中运行两个R脚本,让他们使用两个不同的内核?如果可以做到这一点,我可以节省大量时间,只需让计算机在夜间运行所有这些脚本。

5 个答案:

答案 0 :(得分:16)

假设结果不需要在同一环境中结束,您可以使用RStudio项目实现此目的:https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects

首先创建两个单独的项目。您可以同时打开两个,这将导致两个rsessions。然后,您可以打开每个项目中的每个脚本,并分别执行每个脚本。然后在您的操作系统上管理核心分配。

答案 1 :(得分:14)

在RStudio

如果你右键点击RStudio,你应该可以打开几个单独的会议" RStudio(无论你是否使用Projects)。默认情况下,这些将分别使用1个核心。

更新(2018年7月):作为Preview Release提供的RStudio v1.2.830-1支持"工作"窗格。这专用于在后台运行R脚本,与交互式R会话分开:

  
      
  • 在干净的R会话中运行任何R脚本作为后台作业

  •   
  • 监控进度并实时查看脚本输出

  •   
  • 可选择在启动时为作业提供全局环境,并在完成时将值导出

  •   

这将在RStudio版本1.2中提供。

在终端中运行脚本

如果您知道多个脚本运行没有错误,我建议您通过命令行在不同的参数上运行这些脚本:

RCMD script.R
RScript script.R
R --vanilla < script.R

在后台运行:

nohup Rscript script.R &

这里&#34;&amp;&#34;在后台运行脚本(可以使用fg进行检索,使用htop进行监控,然后使用kill <pid>pkill rsession进行检索)并nohup保存输出在文件中,如果终端关闭,则继续运行。

将参数传递给脚本:

Rscript script.R 1 2 3

这会将c(1, 2, 3)传递给R作为commandArgs()的输出,因此bash中的循环可以使用bash循环运行多个Rscript实例:

for ii in 1 2 3
  do
  nohup Rscript script.R $ii &
  done

在R

中运行并行代码

您经常会发现R脚本中的某个特定步骤会降低计算速度,我是否可以建议在R代码中运行并行代码而不是单独运行它们?我推荐snow package在R中并行运行循环。一般情况下,不要使用:

cl <- makeCluster(n)
# n = number of cores (I'd recommend one less than machine capacity)
clusterExport(list=ls()) #export input data to all cores
output_list <- parLapply(cl, input_list, function(x) ... )
stopCluster() # close cluster when complete (particularly on shared machines)

在R中通常使用lapply函数的任何地方使用它来并行运行它。

答案 2 :(得分:4)

您可以使用以下代码在同一会话中实现多核并行(如此处https://cran.r-project.org/web/packages/doMC/vignettes/gettingstartedMC.pdf所述)

if(Sys.info()["sysname"]=="Windows"){
  library(doParallel)
  cl<-makeCluster(numberOfCores)
  registerDoParallel(cl)
}else{
  library(doMC)
  registerDoMC(numberOfCores)
}
library(foreach)

someList<-list("file1","file2")
returnComputation <-
  foreach(x=someList) %dopar%{
    source(x)
  }


if(Sys.info()["sysname"]=="Windows") stopCluster(cl)

您仍需要调整输出。

答案 3 :(得分:1)

如果您想进行令人尴尬的并行,您可以在终端选项卡(位于控制台选项卡之后)打开所需的终端数量,并使用Rscript yourcode.R运行您的代码。默认情况下,每个代码都将在独立的核心上运行。如果需要,您还可以使用命令行参数(如@Tom Kelly所述)。

答案 4 :(得分:1)

您需要做的所有事情(假设您使用的是Unix / Linux)是运行R batch命令并将其放在后台。这将自动将其分配给CPU。

在外壳上,执行以下操作:

/your/path/$ nohup R CMD BATCH --no-restore my_model1.R &
/your/path/$ nohup R CMD BATCH --no-restore my_model2.R &
/your/path/$ nohup R CMD BATCH --no-restore my_model3.R &
/your/path/$ nohup R CMD BATCH --no-restore my_model4.R &

执行命令,将打印输出保存在文件my_model1.Rout中,并将所有创建的R对象保存在文件RData中。这将在不同的CPU上运行每个模型。会话和输出的运行将放入输出文件中。

如果通过终端通过Internet进行操作,则需要使用nohup命令。否则,退出会话后,进程将终止。

/your/path/$ nohup R CMD BATCH --no-restore my_model1.R &

如果您要赋予进程较低的优先级,请执行以下操作:

/your/path/$ nohup nice -n 19 R CMD BATCH --no-restore my_model.R &

您最好在脚本的开头添加一些代码,以加载和附加相关的数据文件。

永远不要简单

/your/path/$ nohup R CMD BATCH my_model1.R &

这将处理.RData文件(所有有趣的对象也存在),并将严重损害可重复性。也就是说,

--no-restore

--vanilla

是您亲爱的朋友。

如果模型太多,建议您使用云帐户进行计算,因为您可以拥有更多的CPU和RAM。根据您的工作和R软件包的不同,使用当前硬件的模型可能要花费数小时。

我已经学到了很难的方法,但是这里有一个不错的文档:

http://users.stat.umn.edu/~geyer/parallel/parallel.pdf

HTH。