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
#加载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% + 每次执行的函数
library(doparallel)
# 启用parallel作为foreach并行计算的后端
library(doParallel)
cl <- makeCluster(4)
registerDoParallel(cl)
# 并行计算方式
x <- foreach(x=1:1000,.combine='rbind') %dopar% func(x)
#别忘了结束并行
stopCluster(cl)
说在后面
更多内容请关注我的专栏:R语言与数据挖掘 - 知乎专栏
或者关注我的知乎账号:温如
对量化交易(投资)感兴趣的也可以关注专栏:清华大学量化投资协会成果集萃 - 知乎专栏