R语言并行计算(1)
2015-12-23 16:18
267 查看
终于知道了r的并行计算,哈哈,希望运行快,转载连接:1点击打开链接2 点击打开链接,这里只粘贴了第二个连接
众所周知,在大数据时代R语言有两个弱项,其中一个就是只能使用单线程计算。但是在2.14版本之后,R就内置了parallel包,强化了R的并行计算能力。parallel包实际上整合了之前已经比较成熟的snow包和multicore包。前者已经在之前的文章中介绍过了,而后者无法在windows下运行,所以也就先不管了。parallel包可以很容易的在计算集群上实施并行计算,在多个CPU核心的单机上,也能发挥并行计算的功能。我们今天就来探索一下parallel包在多核心单机上的使用。
parallel包的思路和lapply函数很相似,都是将输入数据分割、计算、整合结果。只不过并行计算是用到了不同的cpu来运算。下面的例子是解决欧拉问题的第14个问题。
上例中关键的函数就是parLapply,其中三个参数分别是集群对象、输入参数和运算函数名。我们最后算出的结果是837799。
foreach包是revolutionanalytics公司贡献给R开源社区的一个包。它能使R中的并行计算更为方便。与sapply函数类似,foreach函数中的第一个参数是输入参数,%do%后面的对象表示运算函数,而.combine则表示运算结果的整合方式。
下面的例子即是用foreach来完成前面的同一个任务。如果要启用并行,则需要加载doParallel包,并将%do%改为%dopar%。这样一行代码就能方便的完成并行计算了。
下面的例子是用foreach函数来进行随机森林的并行计算。我们一共要生成十万个树来组合成一个随机森林,每个核心负责生成两万五千个树。最后用combine进行组合。
并行不仅可以在建模时进行,也可以在数据整理阶段进行。之前我们提到过的plyr包也可以进行并行,前提是加载了foreach包,并且参数.parallel设置为TURE。当然不是所有的任务都能并行计算,而且并行计算前你需要改写你的代码。
参考资料:
http://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf
http://cran.r-project.org/web/packages/foreach/vignettes/foreach.pdf
http://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf
众所周知,在大数据时代R语言有两个弱项,其中一个就是只能使用单线程计算。但是在2.14版本之后,R就内置了parallel包,强化了R的并行计算能力。parallel包实际上整合了之前已经比较成熟的snow包和multicore包。前者已经在之前的文章中介绍过了,而后者无法在windows下运行,所以也就先不管了。parallel包可以很容易的在计算集群上实施并行计算,在多个CPU核心的单机上,也能发挥并行计算的功能。我们今天就来探索一下parallel包在多核心单机上的使用。
parallel包的思路和lapply函数很相似,都是将输入数据分割、计算、整合结果。只不过并行计算是用到了不同的cpu来运算。下面的例子是解决欧拉问题的第14个问题。
# 并行计算euler14问题 # 自定义函数以返回原始数值和步数 func <- function(x) { n = 1 raw <- x while (x > 1) { x <- ifelse(x%%2==0,x/2,3*x+1) n = n + 1 } return(c(raw,n)) } library(parallel) # 用system.time来返回计算所需时间 system.time({ x <- 1:1e6 cl <- makeCluster(4) # 初始化四核心集群 results <- parLapply(cl,x,func) # lapply的并行版本 res.df <- do.call('rbind',results) # 整合结果 stopCluster(cl) # 关闭集群 }) # 找到最大的步数对应的数字 res.df[which.max(res.df[,2]),1]
上例中关键的函数就是parLapply,其中三个参数分别是集群对象、输入参数和运算函数名。我们最后算出的结果是837799。
foreach包是revolutionanalytics公司贡献给R开源社区的一个包。它能使R中的并行计算更为方便。与sapply函数类似,foreach函数中的第一个参数是输入参数,%do%后面的对象表示运算函数,而.combine则表示运算结果的整合方式。
下面的例子即是用foreach来完成前面的同一个任务。如果要启用并行,则需要加载doParallel包,并将%do%改为%dopar%。这样一行代码就能方便的完成并行计算了。
library(foreach) # 非并行计算方式,类似于sapply函数的功能 x <- foreach(x=1:1000,.combine='rbind') %do% func(x) # 启用parallel作为foreach并行计算的后端 library(doParallel) cl <- makeCluster(4) registerDoParallel(cl) # 并行计算方式 x <- foreach(x=1:1000,.combine='rbind') %dopar% func(x) stopCluster(cl)
下面的例子是用foreach函数来进行随机森林的并行计算。我们一共要生成十万个树来组合成一个随机森林,每个核心负责生成两万五千个树。最后用combine进行组合。
# 随机森林的并行计算 library(randomForest) cl <- makeCluster(4) registerDoParallel(cl) rf <- foreach(ntree=rep(25000, 4), .combine=combine, .packages='randomForest') %dopar% randomForest(Species~., data=iris, ntree=ntree) stopCluster(cl)
并行不仅可以在建模时进行,也可以在数据整理阶段进行。之前我们提到过的plyr包也可以进行并行,前提是加载了foreach包,并且参数.parallel设置为TURE。当然不是所有的任务都能并行计算,而且并行计算前你需要改写你的代码。
参考资料:
http://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf
http://cran.r-project.org/web/packages/foreach/vignettes/foreach.pdf
http://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf
相关文章推荐
- 控制动画播放及其获取精灵的长宽数据
- 转载:ABAP RFC 详细讲解
- NSCalendar 日历类
- SOUI的SMessage函数使用
- 微信公众平台开发(71)OAuth2.0网页授权
- hdu1151Air Raid——最小路径覆盖
- 流形式下载文件(结合POI生成excel使用)
- INSTALL_FAILED_UPDATE_INCOMPATIBLE
- C++学习笔记-关联容器
- Adb
- DUBBO配置规则详解
- unity, 动态创建节点时一定要先指定父节点再设置transform
- include layout scllorview 常用正则 base 64 网络请求框架
- 路哥教你搭建ssh框架
- C++ public,protected,private继承与访问限制
- iOS之通过PaintCode快速实现交互动画的最方便方法 未解问题
- SO_LINGER使用
- php获取服务器系统信息
- 初识Hadoop's Ecosystem
- AD账户UserAccountControl对应的值