首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同时运行多个R脚本

同时运行多个R脚本
EN

Stack Overflow用户
提问于 2015-06-30 12:06:02
回答 4查看 61.8K关注 0票数 32

在我的论文中,我需要进行大量的仿真研究,这些都需要相当长的时间。我的电脑有4个内核,所以我一直在想,是否可以在Rstudio中同时运行两个R-脚本,让它们使用两个不同的内核?如果能做到这一点,我可以节省很多时间,只需让电脑整夜运行所有这些脚本。

EN

回答 4

Stack Overflow用户

发布于 2017-01-29 12:29:20

在RStudio中

如果您右键单击RStudio,您应该能够打开RStudio的几个单独的“会话”(不管您是否使用项目)。默认情况下,它们将使用每个核心1。

Update (2018年7月):作为预览发布提供的RStudio v1.2.830-1支持“作业”窗格。它专门用于在与交互式R会话分离的背景中运行R脚本:

  • 在干净的R会话中将任何R脚本作为后台作业运行
  • 监视进度并实时查看脚本输出
  • 可以选择在启动时为您的全局环境提供作业,并在完成后返回导出值。

此特性可在RStudio版本1.2 (或更高版本)的版本中使用。

在终端中运行脚本

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

代码语言:javascript
运行
复制
RCMD script.R
RScript script.R
R --vanilla < script.R

在后台运行:

代码语言:javascript
运行
复制
nohup Rscript script.R &

在这里,"&“在后台运行脚本(它可以用fg检索,用htop监视,用kill <pid>pkill rsession杀死),nohup将输出保存在一个文件中,并在终端关闭时继续运行。

向脚本传递参数:

代码语言:javascript
运行
复制
Rscript script.R 1 2 3

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

代码语言:javascript
运行
复制
for ii in 1 2 3
  do
  nohup Rscript script.R $ii &
  done

在R内运行并行代码

您经常会发现R脚本中的一个特定步骤是减慢计算速度,我可以建议在R代码中运行并行代码而不是单独运行它们吗?我推荐在R中并行运行循环的雪包,而不是使用:

代码语言:javascript
运行
复制
cl <- makeCluster(n)
# n = number of cores (I'd recommend one less than machine capacity)
clusterExport(cl, 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函数并行运行它。1:https://www.r-bloggers.com/quick-guide-to-parallel-r-with-snow/

票数 41
EN

Stack Overflow用户

发布于 2016-07-14 10:19:17

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

代码语言:javascript
运行
复制
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)

你还需要调整你的输出。

票数 8
EN

Stack Overflow用户

发布于 2019-02-10 00:19:13

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

在空壳处,做:

代码语言:javascript
运行
复制
/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对象保存在file.RData中。这将在不同的CPU上运行每个模型。会话和输出的运行将放在输出文件中。

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

代码语言:javascript
运行
复制
/your/path/$ nohup R CMD BATCH --no-restore my_model1.R &

如果要赋予进程较低的优先级,则需要:

代码语言:javascript
运行
复制
/your/path/$ nohup nice -n 19 R CMD BATCH --no-restore my_model.R &

最好在脚本的开头包含一些代码来加载和附加相关的数据文件。

永远不要简单地做

代码语言:javascript
运行
复制
/your/path/$ nohup R CMD BATCH my_model1.R &

这将消耗.RData文件(所有有趣的对象也是如此),并将严重损害可再现性。也就是说,

代码语言:javascript
运行
复制
--no-restore

代码语言:javascript
运行
复制
--vanilla

是你亲爱的朋友。

如果您有太多的模型,我建议在云帐户上进行计算,因为您可以拥有更多的CPU和RAM。取决于您正在做什么,以及R包,模型可能需要几个小时的现有硬件。

我很难学到这一点,但这里有一份很好的文件:

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

HTH。

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

https://stackoverflow.com/questions/31137842

复制
相关文章

相似问题

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