楼主: dalezxr
5642 7

[学科前沿] 大数据时代对R提出的要求 [推广有奖]

  • 3关注
  • 5粉丝

已卖:87份资源

硕士生

25%

还不是VIP/贵宾

-

威望
0
论坛币
7697 个
通用积分
0
学术水平
1 点
热心指数
3 点
信用等级
1 点
经验
1835 点
帖子
136
精华
0
在线时间
109 小时
注册时间
2009-7-8
最后登录
2022-4-23

楼主
dalezxr 发表于 2013-4-8 16:18:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
原文出处:http://www.r-bloggers.com/lang/chinese/1131用Parallel和foreach包玩转并行计算September 26, 2012
By 写长城的诗

parallel.pdf (285.28 KB, 需要: 24 个论坛币)

This post was kindly contributed by 数据科学与R语言 - go there to comment and to read the full post.



众所周知,在大数据时代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

Tags: 并行计算, 随机森林





二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:大数据时代 大数据 contribute September Parallel windows comment 长城 文章 能力

已有 1 人评分经验 收起 理由
ltx5151 + 20 鼓励积极发帖讨论

总评分: 经验 + 20   查看全部评分

沙发
2710202012(未真实交易用户) 发表于 2013-4-8 20:29:03
好文章!!
生命不息,奋斗不止

藤椅
coddz(未真实交易用户) 发表于 2013-4-8 20:35:40
好东东,谢谢LZ分享!

板凳
jgchen1966(未真实交易用户) 发表于 2013-4-9 16:32:31
good
鹑居鷇食,鸟行无彰

报纸
liangzai924(未真实交易用户) 发表于 2013-4-14 16:32:48
谢谢分享!!!

地板
complicated(未真实交易用户) 在职认证  发表于 2015-6-26 17:28:09
mark,并行计算有点意思,希望有更多成功应用的场景~

7
ljianb2005(未真实交易用户) 发表于 2015-7-5 22:23:50
我想在函数内部使用并行运算,我无论怎样调试,都不成功。我想,是不是在函数内部不用调用并行运算命令?我用的是foreach包。

8
soccy(未真实交易用户) 发表于 2015-7-6 00:11:14
太老了,需要更新。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-21 07:40