Python作为多线程的编程语言在并行方面相对于R语言有很大的优势,然而作为占据统计分析一席之地的R语言自然不能没有并行计算的助力。那么我们来看下在R语言中有哪些并行的包:隐式并行:OpenBLAS,Intel MKL,NVIDIA cuBLAS等;显性并行:parallel(主打lapply应用)、foreach(主打for循环)、SupR、还有利用GPU的办法(gpuR)。所谓显式并行也就是基于并行的编程语言编译的程序;隐式并行是基于串行程序编译的并行计算。当然,在R语言核心功能中也是带有了相关的并行的计算基础包parallel。今天就给大家介绍下这个基础并行包的具体应用。
我们不需要再安装这个包,可以直接进行相关的计算。首先我们看下里面的几个核心的函数:
1. detectCores() 发现PC终端有多少个核。所谓核就是CPU的性能体现,越多越好。实例:
library(parallel)cl.cores #发现可用核数
2. makeCluster() 初始化我们需要用到的核数。其中type参数有两种PSOCK适用所有操作系统,FORK适用unix/max,实现内存共享以及节省内存。实例:
cl "cl.cores", 2),type="PSOCK")
3. clusterExport() 将变量载入并行的环境中。实例:
xx=1:10clusterExport(cl, "xx")#读入变量数据
4. clusterEvalQ(,{code}) 将包或者代码直接载入并行环境。实例:
clusterEvalQ(cl,{library(ggplot2);xy=1:10})
clusterCall(cl, function(y) xy + y, 2:10)
5. clusterCall() 在并行环境中,一次运行过程在各节点的值。clusterMap便可以直接运行所用的值,并以列表形式展示所有结果。实例:
clusterCall(cl, function(y) xx + y, 2:10)
clusterMap(cl,function(y) xx + y,2:10)
6. parLapply(), parSapply(), 和 parApply() 和函数 lapply, sapply 及 apply一一对应。可以直接将自定义的函数引入并行环境。实例:
parSapply(cl,2:10, function(y) xx + y)
7. clusterApply() 类似parLapply 系列,可以直接运行得到所有结果,输出列表格式。clusterApplyLB()便是对其的优化,具体的优化模式我们就不赘述了。实例:
clusterApply(cl,2:10, function(y) xx + y)
8. do.call() 针对某个数据集执行指定的函数功能。实例:
res=clusterApply(cl,2:10, function(y) xx +y)do.call('rbind',res)
9. stopCluster() 关闭集群。实例
stopCluster(cl)
以上便是parallel包的全部功能函数,其实并行真正解决的是重复性工作的情况,在P值的计算中应用比较广泛。然而对于递归计算需要一定的优化才能使用并行计算,不然不一定有单机的效率高。
欢迎互相学习交流!