我有一个运行Windows XP的四核笔记本电脑,但只看到任务pipe理器R似乎一次只能使用一个处理器。 如何让R使用全部四个处理器并加速我的R程序?
我有一个基本的系统,我在“for”循环中并行执行程序。 一旦你明白需要做什么,这个方法很简单。 它只适用于本地计算,但是这似乎是你所追求的。
你需要安装这些库:
library("parallel") library("foreach") library("doParallel")
首先,您需要创建您的计算群集。 我通常在运行并行程序时做其他的事情,所以我想打开一个。 “detectCores”函数将返回计算机中的核心数量。
cl <- makeCluster(detectCores() - 1) registerDoParallel(cl, cores = detectCores() - 1)
接下来,使用“foreach”命令和%dopar%运算符调用for循环。 我总是使用一个“尝试”包装来确保丢弃操作失败的任何迭代,并且不会中断其他好的数据。 您需要指定“.combine”参数,并将所有必需的包传递到循环中。 请注意,“i”是用等号定义的,而不是“in”运算符!
data = foreach(i = 1:length(filenames), .packages = c("ncdf","chron","stats"), .combine = rbind) %dopar% { try({ # your operations; line 1... # your operations; line 2... # your output }) }
一旦你完成了,清理:
stopCluster(cl)
CRAN任务视图在高性能Compting与R列出几个选项。 XP是一个限制,但你仍然可以在几分钟之内使用套接字来获得像雪一样的东西。
从2.15版开始,R现在支持多核计算。 只需加载并行包
library("parallel")
并检查出相关的小插曲
vignette("parallel")
我听说, REvolution R支持更好的多线程,那么R的典型CRAN版本和REvolution在Windows中也支持64位R。 我一直在考虑购买一个副本,但我发现他们的价格不透明。 他们的网站上没有价目表。 很奇怪。
我相信multicore
包可以在XP上运行。 它提供了一些基本的多进程功能,特别是通过提供lapply()
一个简单的方法来替换一个新线程( mcparallel()
)中的一个表达式。
在Windows上,我相信这样做的最好方法可能是像大卫史密斯所说的那样,在每一秒钟和下雪的时候。
但是,基于Unix / Linux的系统可以使用“多核”程序包使用多个进程进行计算。 它提供了一个高级函数“mclapply”,它执行多核心的列表理解。 “多核”软件包的一个优点是每个处理器都可以获得可能修改的全局环境的私有副本。 最初,这个副本只是一个指向全局环境的指针,如果将全局环境视为只读,则非常快速地共享变量。
Rmpi要求数据在R进程之间显式传输,而不是使用“多核”封闭方法。
– 丹
如果你做了很多的矩阵操作,而且你使用的是Windows,那么你可以免费安装revolutionanalytics.com/revolution-r-open ,而这个包含了intel MKL库,它允许你做多线程的矩阵操作。 在Windows上,如果您从安装中取出libiomp5md.dll,Rblas.dll和Rlapack.dll文件,并覆盖您喜欢使用的任何R版本的文件,则您将拥有多线程矩阵操作(通常会获得10-20倍的加速比用于矩阵运算)。 或者你可以使用prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64的Atlas Rblas.dll,它也可以在64位R上运行,几乎和MKL一样快。 我发现这是在Windows系统上大幅提高R性能的最简单的事情。 不知道为什么他们没有像R Windows上安装时那样标准化。
在Windows上,R不支持多线程(除非通过Rcpp使用OpenMP ),并且Windows系统上可用的基于SOCKET的并行化(例如,通过程序包并行)的效率非常低。 在POSIX系统上,你可以使用分叉的东西更好。 (包multicore
是我相信最有效率的一个)。 你也可以尝试在共享内存模型中使用包Rdsm
进行多线程处理 – 我的github上有一个版本,它具有unflagged -unix唯一标志,并且也可以在Windows上工作(早期的Windows不支持,因为依赖关系大bigmemory
据说没有在Windows上工作,但现在看起来确实如此):
library(devtools) devtools::install_github('tomwenseleers/Rdsm') library(Rdsm)