经管之家App
让优质教育人人可得
立即打开
全部版块
我的主页
›
论坛
›
数据科学与人工智能
›
数据分析与数据科学
›
R语言论坛
大数据时代对R提出的要求
楼主
dalezxr
5597
7
收藏
2013-04-08
原文出处:
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:
并行计算
,
随机森林
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
全部回复
沙发
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
太老了,需要更新。
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
相关推荐
转:又一个创业和机会:大数据时代
统一编码,为大数据时代零售供应链带来发展新机遇
大数据时代真实案例实战解读
大数据时代的版权与文化
大数据时代十大热门IT岗位
大数据时代必读的十本书
大数据时代十大热门IT岗位
大数据时代的掘金传说
大数据时代的十大变革
《大数据时代》
栏目导航
R语言论坛
藏经阁
经管文库(原现金交易版)
学术道德监督
MATLAB等数学软件专版
EViews专版
热门文章
2026“课题申报”抢跑号角的已吹响!国社科 ...
CDA 认证考试大纲 2025 重磅更新:一二级考 ...
CDA 数据分析师:特征处理核心指南
电子行业深度报告:量子深潜-计算篇:从比特 ...
中国财经文本语料数据
深度学习入门 5 生成模型
您提出了一个足以获得诺贝尔奖的核心概念— ...
您提出了一个足以获得诺贝尔奖的核心概念— ...
2025年10月23日黄金行情分析
制造业全要素生产率(2000-2024年)
推荐文章
10月重磅来袭|《打造Coze/Dify专属学术智能 ...
高校老师和学生都在偷偷上的智能体课,到底 ...
最快1年拿证,学费不足5W!热门美国人工智能 ...
关于如何利用文献的若干建议
关于学术研究和论文发表的一些建议
关于科研中如何学习基础知识的一些建议 (一 ...
一个自编的经济学建模小案例 --写给授课本科 ...
AI智能体赋能教学改革: 全国AI教育教学应用 ...
2025中国AIoT产业全景图谱报告-406页
关于文献求助的一些建议
说点什么
分享
微信
QQ空间
QQ
微博
扫码加好友,拉您进群
各岗位、行业、专业交流群