snow包

snow包主要运行于传统的集群计算。它主要用于蒙特卡洛模拟(Monte Carlo simulations),boostrapping,交叉验证(cross validation),集成机器学习算法(ensemble machine learning algorithms)和K均值聚类(K-Means clustering)等,并且也很好支持并行随机数的生成。 
snow包的安装一般应用install.packages('snow')
要使用snow包进行并行运算,首先要创建一个集群对象,主要用于与内核的交互,一般传递与snow包中函数的第一个参数。 
基本的集群创建函数为makeCluster(),它能创建任何类型的集群,例如,在本地机器上创建一个4核的集群:

cl <- makeCluster(4, type="SOCK")
  • 1

第一个参数为集群设定,即设定使用的CPU数;第二个参数是集群类型。 
注意:在结束集群时使用stopCluster()。 
下面使用snow包做一个并行运算。

并行运算K均值聚类

数据是MASS包自带的Boston数据集。 
K均值函数使用stats包中的kmeans()。

library(MASS)
result <- kmeans(Boston, 4, nstart = 100)
  • 1
  • 2

在使用并行计算前,首先看看使用lapply函数的运行情况

results <- lapply(rep(25,4), function(nstart) kmeans(Boston, 4, nstart = nstart)
i <- sapply(results, function(result) result$tot.withiness)
result <- results[[which.min(i)]]
  • 1
  • 2
  • 3

使用clusterApply并行计算

library(snow)
cl <- makeCluster(4, type="SOCK")
ignore <- clusterEvalQ(cl, {library(MASS); NULL}) #用clusterEvalQ函数初始化内核,在每一个内核中载入包
results <- clusterApply(cl, rep(25, 4), function(nstart) kmeans(Boston, 4, nstart=nstart)) #parallel computing
i <- sapply(results, function(result) result$tot.withinss)
result <- results[[which.min(i)]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

相比较clusterEvalQ而言,clusterCall更好用,它的第一个参数为集群对象,第二个参数为一个函数,并且其他的参数可以传递给这个函数。最终返回一个列表。

clusterCall(cl, function() { library(MASS); NULL })
  • 1

clusterCall函数可以调用多个包,

worker.init <- function(packages) {for (p in packages) {
library(p, character.only=TRUE)
}
NULL
}
clusterCall(cl, worker.init, c('MASS', 'boot'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

character.only=TRUE是使library把参数解释为字符向量,否则library会重复载入名称为p的包。

使用clusterApplyLB并行运算

clusterApplyLB与clusterApply函数相似,但clusterApplyLB的运行效率更高。在使用clusterApply并行运算时,如果每一个内核花费不同的时间进行运算,那么在那个运行时间长的内核结束之前,运行时间短的内核不能进行下一次运算,而clusterApplyLB不同,它是在运行时间短的内核结束之后接着就运行下一次的运算,这样就减少了时间的浪费,因此提高了效率。 
为了说明clusterApplyLB的效率,我们使用控制任务时间长度的函数Sys.sleep。用snow.time收集整个执行过程的时间信息。

set.seed(7777442)
sleeptime <- abs(rnorm(10, 10, 10))
tm <- snow.time(clusterApplyLB(cl, sleeptime, Sys.sleep))
plot(tm)
  • 1
  • 2
  • 3
  • 4

 
作为对照,我们用clusterApply函数来观察运行时间

tm1 <- snow.time(clusterApply(cl, sleeptime, Sys.sleep))
plot(tm1)
  • 1
  • 2

 
由此看出clusterApplyLB效率更高。

使用parLapply并行运算

parLapply是snow包中的一个高级函数,它比clusterApply函数更高效,如果参数x的长度与内核的数量相等,parLapply的优势不明显,如果参数x的长度远大于内核的数量,parLapply相比于clusterApply是一个更好的选择。 
应用一个并行休眠函数的用法,首先使用clusterApply

bigsleep <- function(sleeptime, mat) Sys.sleep(sleeptime)
bigmatrix <- matrix(0, 2000, 2000)
sleeptime <- rep(1, 100)
tm2 <- snow.time(clusterApply(cl, sleeptime, bigsleep, bigmatrix))
plot(tm2)
  • 1
  • 2
  • 3
  • 4
  • 5

 
由图看出并不高效,因为有大量的输入输出时间,下面再试一试clusterApplyLB:

tm3 <- snow.time(clusterApplyLB(cl, sleeptime, bigsleep, bigmatrix))
plot(tm3)
  • 1
  • 2

 
由上图看出,运算集中在第1、2和3个内核上,第4个内核上运算的时间非常少,及运算效率差,但总体还是比clusterApply函数要好一些。 
看看最终的函数parLapply:

tm4 <- snow.time(parLapply(cl, sleeptime, bigsleep, bigmatrix))
plot(tm4)
  • 1
  • 2

 
由此看出,传输交换的时间大大缩短了,因此提高了效率。

R语言并行运算(snow包)相关推荐

  1. R语言并行计算snow包文档(beta)

    1.snow-clusterCluster-Level on a snow cluster snow-clusterCluster-Level on a snow cluster clusterSpl ...

  2. 三线表是什么?R语言使用table1包绘制(生成)三线表、构建不分层的三线表

    三线表是什么?R语言使用table1包绘制(生成)三线表.构建不分层的三线表 目录

  3. R语言使用psych包进行探索性因子分析EFA、使用cov2cor函数将原始数据的协方差矩阵将其转换为相关性矩阵( covariance matrix into correlation matrix)

    R语言使用psych包进行探索性因子分析EFA.使用cov2cor函数将原始数据的协方差矩阵将其转换为相关性矩阵( covariance matrix transform into correlati ...

  4. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义函数在三线表中添加p值

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义函数在三线表中添加p值 目录

  5. R语言使用caret包构建遗传算法树模型(Tree Models from Genetic Algorithms )构建回归模型、通过method参数指定算法名称

    R语言使用caret包构建遗传算法树模型(Tree Models from Genetic Algorithms  )构建回归模型.通过method参数指定算法名称.通过trainControl函数控 ...

  6. R语言使用DALEX包的model_profile函数对caret包生成的多个算法模型的离散变量进行分析、使用偏依赖图(Partial Dependence Plots)解释某个离散特征和目标y的关系

    R语言使用DALEX包的model_profile函数对caret包生成的多个算法模型的离散变量进行分析.使用偏依赖图(Partial Dependence Plots)解释某个离散特征和目标值y的关 ...

  7. R语言使用timeROC包计算存在竞争情况下的生存资料多个标记物在相同时间下的cox及协变量分析AUC值、并可视化多个标记物在相同时间下的ROC值、多指标的ROC曲线(Time-dependent R

    R语言使用timeROC包计算存在竞争情况下的生存资料多个标记物在相同时间下的cox及协变量分析AUC值.并可视化多个标记物在相同时间下的ROC值.多指标的ROC曲线(Time-dependent R ...

  8. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、使用fa.diagram函数可视化斜交旋转因子分析、并解读可视化图形

    R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用rotate参数指定进行斜交旋转提取因子.使用fa.diagram函数可视化斜交旋转因子分析.并解读可视化图形 目 ...

  9. R语言使用caret包的preProcess函数进行数据预处理:对所有的数据列进行SpatialSign变换(将数据投影到单位圆之内)、设置method参数为spatialSign

    R语言使用caret包的preProcess函数进行数据预处理:对所有的数据列进行SpatialSign变换(将数据投影到单位圆之内).设置method参数为spatialSign 目录

最新文章

  1. SourceForge 停止在被遗弃项目捆绑第三方软件
  2. iis 服务器出现server too busy!
  3. Hadoop详解(一):Hadoop简介
  4. 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】
  5. C++ 多态实现机制
  6. PMCAFF微课堂 | 《社交红利2.0:即时引爆》徐志斌教你玩转社交
  7. html原生音频播放器倍速,HTML5倍数功能视频播放器(加速2倍,1.5倍播放)
  8. HTML、sqlserver数据库和java前七章节的复习(一)
  9. Windows SharePoint Services 3.0 Tools: Visual Studio 2005 Extensions发布1.1 CTP版本扩展
  10. Maven简述及安装
  11. mysql lower_case_table_names 区分表名大小写设置
  12. python的__name__
  13. 怎么让照片变年轻_做了隆鼻,至少年轻5岁
  14. [CTSC1999][网络流24题]家园
  15. P3200 [HNOI2009]有趣的数列
  16. 如何导出久其报表所有数据_久其报表不能传输怎么办?
  17. ASP.NET课设——新闻发布系统
  18. PX4(Pixhawk)和Audupilot(APM)的区别与联系
  19. html新建站点的操作步骤,如何在服务器上建立站点的方法步骤
  20. 血型(输血-受血)匹配数电设计

热门文章

  1. 计算机java毕业设计 SSM的共享充电宝管理系统(源码+论文)
  2. 【python表白神器】手把手教你用代码浪漫追求对象!(附完整源码+讲解)
  3. Warning: Can‘t perform a React state update on an unmounted component. This is a no-op, but it indic
  4. signal.medfilt( )函数(中值滤波)
  5. 如何简单有效快速提高英语口语学习能力方法技巧
  6. Linux驱动开发之工作队列
  7. [ 云计算 | AWS ] 在控制台创建 Amazon EC2 实例
  8. file文件C语言,C语言 File文件处理 创建和写文件
  9. 电解铜箔行业分析:铜箔废液中对铜回收,达成提能减排
  10. Meta研究人员利用人工智能解码脑电语音信号(全文解读)