在我的论文中,我需要进行大量的模拟研究,这些研究都需要很长时间。我的计算机有4个内核,所以我一直想知道是否可以同时在Rstudio中运行两个R脚本,让他们使用两个不同的内核?如果可以做到这一点,我可以节省大量时间,只需让计算机在夜间运行所有这些脚本。
答案 0 :(得分:16)
假设结果不需要在同一环境中结束,您可以使用RStudio项目实现此目的:https://support.rstudio.com/hc/en-us/articles/200526207-Using-Projects
首先创建两个单独的项目。您可以同时打开两个,这将导致两个rsessions。然后,您可以打开每个项目中的每个脚本,并分别执行每个脚本。然后在您的操作系统上管理核心分配。
答案 1 :(得分:14)
如果你右键点击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代码中运行并行代码而不是单独运行它们?我推荐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。