编者按

总的来说,R的运算速度不算快,不过类似并行运算之类的改进可以提高运算的性能。下面非常简要地介绍如何利用R语言进行并行运算。


代码如下:

library(parallel)#自带的包

cl.cores <- detectCores()

cl <- makeCluster(cl.cores)

detectCores( )检查当前电脑可用核数。

makeCluster(cl.cores)使用刚才检测的核并行运算。

说明文档里这样描述makeCluster函数:Creates a set of copies of R running in parallel and communicatingover sockets. 即同时创建数个R进行并行运算。在该函数执行后就已经开始并行运算了,电脑可能会变卡一点。尤其在执行par开头的函数时。


在并行运算环境下,常用的一些计算方法如下:

1. clusterEvalQ(cl,expr)函数利用创建的cl执行expr这里利用刚才创建的cl核并行运算expr。expr是执行命令的语句,不过如果命令太长的话,一般写到文件里比较好。比如把想执行的命令放在Rcode.r里:

clusterEvalQ(cl,source(file="Rcode.r"))


2.par开头的apply函数族。这族函数和apply的用法基本一样,不过要多加一个参数cl。一般如果cl创建如上面cl <- makeCluster(cl.cores)的话,这个参数可以直接用作parApply(cl=cl,…)。当然Apply也可以是Sapply,Lapply等等。注意par后面的第一个字母是要大写的,而一般的apply函数族第一个字母不大写。另外要注意,即使构建了并行运算的核,不使用parApply()函数,而使用apply()函数的话,则仍然没有实现并行运算。换句话说,makeCluster只是创建了待用的核,而不是并行运算的环境。

最后,终止并行运算只需要一行命令

stopCluster(cl)


案例1、不使用并行计算,直接使用lapply(隐式循环函数,它实际就是对不同的数据应用了相同的函数):

fun=function(x){

  return(x-sqrt(x))

}

system.time({

res <- lapply(1:5000000, fun);

});


案例2、使用parallel包来加速

library(parallel)

#打开四核,具体核数根据机器的核数决定

cl <-makeCluster(getOption("cl.cores", 4));

system.time({

res <- parLapply(cl, 1:5000000,  fun)

});


这个函数需要注意:

虽然可以看到运算速度是有所提升的,而实际情况中并非核数越多越好,看机器配置。

首先要先用detectCores函数确定系统核心数目,对于Window系统下的Intel I5或I7 处理器,一般使用detectCores(logical = F)来获得实际的物理核心数量,在大数据的处理下要使用得格外谨慎。


参考文献:


http://blog.sina.com.cn/s/blog_13ec737150102x58p.html



往期「精彩内容」,点击回顾

DNA测序历史 | CircRNA数据库 | Epigenie表观综合 | 癌症定位

BWA介绍  |  源码安装R包 | CancerLocator  | lme4 | 450K分析

乳腺癌异质性 BS-Seq  | 隐马模型 | Circos安装 |  Circos画图

KEGG标记基因 |  GDSC  |  Meta分析  |   R线性回归和相关矩阵

精彩会议及课程,点击回顾

计算表观遗传学大数据前沿学术论坛会议记实

哈尔滨医科大学2017年全国生物信息学暑期学校

2017龙星课程系列(一)

2017龙星课程系列(二)
2017龙星课程系列(三)

2017龙星课程系列(四)

2017龙星课程系列(五)



©著作权归作者所有:来自51CTO博客作者mob604756f4ef89的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 隐马尔科夫模型-前向算法
  2. 函数节流你应该知道的那点事
  3. R语言生存分析入门
  4. 黑盒测试需要使用哪些软件?
  5. 本周AI开源项目精选 | 时间序列预测模型、用于对图像进行自我监
  6. 开源项目,动作识别的开源框架Sense + 多对象目标跟踪神器火热出炉
  7. phpstorm激活码 2021年4月phpstorm激活码提前更新啦
  8. 对复杂网络节点重要性的排序方法
  9. 组蛋白修饰预测基因表达

随机推荐

  1. go语言依赖管理介绍
  2. golang切片需要make吗
  3. golang map 不排序怎么办
  4. golang判断错误类型的方法
  5. golang使用什么数据库?
  6. golang怎么自定义错误
  7. golang 如何部署到服务器?
  8. golang解决中文乱码的方法
  9. go语言中的排序讲解
  10. golang怎么给slice赋长度