提升R的性能和突破内存限制的技巧
本文为雪晴数据网《R语言大规模数据分析实战》 http://www.xueqing.tv/course/56 的课程学习笔记。
该课程目前更新到“第2章 Microsoft R Server简介”的微软数据科学家介绍MRS,后续教学主要是关于MRS的内容,再另外学习,所以本文只学习“第1章 提升R的性能和突破内存限制的技巧”。
1. 课程介绍
1.1 课程目录
第一章 突破R内存瓶颈的一些小技巧
升级硬件和软件
减少数据复制
利用整数的优势
有效地存储数据
在转换数据的时候避免循环
在关键函数里使用C、C++或Fortran
尽可能地使用面向行的数据转换
排序之前要三思
使用bigmemory家族的包
借助数据库
使用Revolution R Enterprise(简称RRE)
第二章 RRE的简介
RRE学术版的下载与安装
RRE的功能介绍
导入数据的函数
概括数据的函数
RRE可视化功能
RRE所支持的算法介绍
第三章 用RRE做数据探索
导入数据
用rxGetVarInfo()函数查看数据的基本特征
用rxSummary()函数计算数据的描述统计量
用rxHistogram()分析数据的分布
用rxLinePlot()可视化分析两个变量之间的关系
用rxCrossTabs()分析变量间的关系
用with rxCube()分析变量间的关系
第四章 用RRE做数据整理
数据融合
用rxDataStep()做数据变换
用dplyrXdf包整理数据
第五章 用RRE做数据挖掘(案例实战)
数据准备
导入数据
数据探索
线性回归
逻辑回归
K-means聚类
决策树分类
1.2 课程视频目录
第1章:提升R的性能和突破内存限制的技巧
如何提升R的性能
并行计算
第2章:Microsoft R Server简介
- 微软数据科学家介绍MRS
2. 第1章:提升R的性能和突破内存限制的技巧
2.1 如何提升R的性能
这一节先介绍提高R性能的几种方法,然后重点介绍如何利用R的内部机制来提升性能。
2.1.1 性能提升的方法
a.1 系统升级
升级硬件
使用64位操作系统
利用GPU
租用云计算服务器
a.2 开发层面的优化
算法
降低算法复杂度调用C/C++或者Fortran
关键的、耗时的计算步骤缓冲技术
减少重复计算
a.3 使用层面的优化
充分利用R的内存机制——R的基础优化
增强R的矩阵运算——加速BLAS
并行计算
大规模数据的处理——图片内存限制
使用Revolution R Enterprise(RRE)
下列介绍通过充分利用R的内部机制优化性能
2.1.2 向量化
向量化的代码,不要用循环!
利用矩阵运算
利用内置的向量化函数,比如exp、sin、rowMeans、rowSums、colSums、ifelse等
利用Vectorize函数将非向量化的函数改装为向量化的函数
*apply函数族:apply、lapply、sapply、tapply、mapply等
plyr和dplyr包
Rstudio发布的data wrangling cheat sheet
## 利用矩阵运算n 1 and only the first element will be used## 在函数的定义中有if语句,不能接受向量作为判断的条件,否则判断第一个元素。## 利用ifelse函数做向量化的判断myfunc 1. 调用rm(list = ls())可以删除内存中的所有对象1. 删除指定的对象可以用rm(object)1. gc()内存垃圾回收使用rm(object)删除变量,要使用gc()做Garbage collection,否则内存是不会自动释放的,相当于你没做rm。### 2.1.6 分析内存的函数1. ls()列出特定环境中的对象1. object.size()返回R对象的大小(近似的)1. memory.profile分析cons单元的使用情况1. memory.size()监测全部内存的使用情况(仅Windows下可用)1. memory.limit()系统可分配的内存上限(仅Windows下可用)memory.limit(newLimit)更改到一个新的上限。 注意,在32位的R中,封顶上限为4G,你无法在一个程序上使用超过4G (数位上限)。这种时候,可以考虑使用64位的版本。## 2.2 并行计算本节主要介绍parallel包,后续介绍R与Hadoop的结合### 2.2.1 parallel包parallel包实际上整合了之前已经比较成熟的snow包和multicore包,multicore无法在windows下运行。
一个简单的例子
system.time(for(i in 1:4){Sys.sleep(2)})
或者用lapply改写成:
system.time(lapply(1:4, function(i) Sys.sleep(2)))
设置并行环境
library(parallel)
检测系统可用的核数
detectCores()
默认返回的结构逻辑的核数,需修改logical=FALSE,返回物理核数
detectCores(logical=FALSE)
建立2核的集群
cl
doMPI与Rmpi包配合使用
doRedis与rredis包配合使用
doMC提供parallel包的多核计算接口
doSNOW提供现已废弃的SNOW包的接口
library(foreach)## 注册并行后端library(doParallel)cl 不知何故,在Mac OSX 下采用doParallel速度特别慢, 比不用并行还慢,于是又尝试了doMC
library(doMC)
设置并行核数, 并注册并行
registerDoMC(2)
开始计算
system.time(foreach(i=1:4) %dopar% sqrt(i))
比较不并行计算和doParallel并行计算
system.time(foreach(i=1:4) %do% sqrt(i))
cl Getting Started with doParallel and foreach的解释如下:
With small tasks, the overhead of scheduling the task and returning the result can be greater than the time to execute the task itself, resulting in poor performance. In addition, this example doesn’t make use of the vector capabilities of sqrt, which it must to get decent performance. This is just a test and a pedagogical example, not a benchmark.
对于小任务,调度任务并返回结果的开销可能比执行任务本身还耗时,导致表现不佳。
下列为实际的例子
x 1. 有没有高人能使得R迅速释放占的内存 http://cos.name/cn/topic/139522/1. 也谈提高R语言的运算效率 http://cos.name/2009/12/improve-r-computation-efficiency/1. R语言并行计算的原理和案例 http://www.tbk.ren/article/63.html?source=sinablog1. R高性能包介绍与并行运算 http://www.idatacamp.com/2015/09/10/r高性能包介绍与并行运算/1. R语言 并行处理 http://cangfengzhe.github.io/r/R-parallel.html1. Getting Started with doParallel and foreach https://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf1. parallel http://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf#r、学习笔记#
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!