绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
【效率提升】R语言并行计算
2020-06-17 14:07:33

parallel包简介

在初,R语言有一个极大的缺点,就是只能使用单线程计算。但是R在2.14版本之后,R就内置了parallel包,强化了R的并行计算能力。parallel包的思路和lapply函数很相似,都是将输入数据分割、计算、整合结果。只不过并行计算是用到了不同的cpu内核来运算。

在parallel包里,对应上述两种并行化方式有如下两个核心函数(针对于lapply函数的并行化,mclapply在windows上不能使用):
parLapply(cl, x, FUN, ...)
mclapply(X, FUN, ..., mc.cores)

案例1使用parlapply函数

情况1:不使用parallel进行并行计算
fun <- function(x){
return (x+1);
}

system.time({
res <- lapply(1:5000000, fun);
});

user  system elapsed
21.42    1.74   25.70
情况2:使用parallel进行并行计算
#加载parallel包
library(parallel)

#detectCores函数可以告诉你你的CPU可使用的核数
clnum<-detectCores() 

#设置参与并行的CPU核数目,这里我们使用了所有的CPU核,也就是我们刚才得到的clnum,具体到这个案例,clnum=4
cl <- makeCluster(getOption("cl.cores", clnum));

#运行
system.time({
res <- parLapply(cl, 1:5000000,  fun)
});
user system elapsed
6.54 0.34 19.95

#关闭并行计算
stopCluster(cl);
我们可以看到运行速度得到了提升。

案例2:在Linux下使用mclapply函数

mc <- getOption("mc.cores", 3)
system.time({
res <- mclapply(1:5000000, fun, mc.cores = mc);
});
user system elapsed
6.657 0.500 7.181

案例3:foreach包的使用

foreach包也是在并行计算中经常被使用的包,主要是对原本的for循环进行并行运算。使用方法如下:


#加载foreach
library(foreach)

#下面这行代码相当于sapply
x <- foreach(x=1:1000,.combine='rbind') %do% func(x)

#注意1:x后面是等号不是“in”,“.combine"表示合并方式,rbind就是按行成矩阵(data.frame),如果不填,默认返回一个list。
#注意2:foreach函数后面要跟 %do% + 每次执行的函数
foreach也可以进行并行运算,只需将%do%改为%dopar%,并加载doparallel包。
library(doparallel)

# 启用parallel作为foreach并行计算的后端
library(doParallel)
cl <- makeCluster(4)
registerDoParallel(cl)

# 并行计算方式
x <- foreach(x=1:1000,.combine='rbind') %dopar% func(x)
#别忘了结束并行
stopCluster(cl)

说在后面

更多内容请关注我的专栏:R语言与数据挖掘 - 知乎专栏

或者关注我的知乎账号:温如

对量化交易(投资)感兴趣的也可以关注专栏:清华大学量化投资协会成果集萃 - 知乎专栏

分享好友

分享这个小栈给你的朋友们,一起进步吧。

R语言
创建时间:2020-06-15 11:46:51
R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的工具。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 小雨滴
    专家
戳我,来吐槽~