《统计分析软件:使用R与Python》 课件 第8章- R 语言大数据分析_第1页
《统计分析软件:使用R与Python》 课件 第8章- R 语言大数据分析_第2页
《统计分析软件:使用R与Python》 课件 第8章- R 语言大数据分析_第3页
《统计分析软件:使用R与Python》 课件 第8章- R 语言大数据分析_第4页
《统计分析软件:使用R与Python》 课件 第8章- R 语言大数据分析_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8.1R语言效率编程8.2内存管理8.3R并行处理包8.4R高效读取大数据第8章

R语言大数据分析R语言大数据分析内存管理R并行处理包parallel软件包foreach软件包R高效读取大数据fread()数据库处理dplyrR语言效率编程system.time向量化

C++编程apply族函数R将所有的对象都存储在虚拟内存中。当分析大数据集时,这种设计会降低程序运行速度,有时还会产生跟内存相关的错误。“cannotallocatevectorofsize或无法分配大小向量”“cannotallocatevectoroflength或无法分配长度向量”解决方案:提高程序执行效率采用并行计算改变数据结构或把数据储存在外部8.1效率编程检查代码运行时间用system.time()衡量运行时间,包括user,system和elapsed三个时间。X<-rnorm(100000)Y<-rnorm(100000)Z<-rep(NA,100000)system.time({for(iin1:100000){Z[i]<-X[i]+Y[i]}})usersystemelapsed0.540.000.55用户时间。执行用户命令所需CPU时间。系统时间是打开或关闭文件、分配和释放内存、执行系统命令所需CPU时间实际运算时间。源程序实际所需的总运算时间,包括操作系统调度的时间。通常是user与system时间和。向量化运算是R的特点之一。避免使用for这样的显式循环语句,最大化地实现R计算过程的向量化,R的计算速度绝对不容鄙视。X<-rnorm(100000)Y<-rnorm(100000)Z<-c()for(iin1:100000){Z<-c(Z,X[i]+Y[i])#thistakesabout54.09seconds}Z<-rep(NA,100000)for(iin1:100000){Z[i]<-X[i]+Y[i]#thistakesabout0.54seconds}Z<-X+Y#0.002seconds(approx)向量化运算优先使用base包提供的命令base包的命令是一般经过优化的,速度有保障。X<-rnorm(10000000)mean_r=function(x){ m=0 n=length(x) for(iinseq_len(n)) m=m+x[i]/n m}mean_r(X)#0.41mean(X)#0.02可以通过Rcpp、RcppEigen、RcppArmadillo进行R与C++混合编程,用C++分配内存或计算。Library(Rcpp)cppFunction('intfib_cpp_0(intn){ if(n==1||n==2)return1; return(fib_cpp_0(n-1)+fib_cpp_0(n-2));}')fib_r<-function(n){ if(n==1||n==2)return(1) return(fib_r(n-1)+fib_r(n-2))}R调用C,C++或Fortranapply族函数apply族函数:lapplysapplyapplytapplymapply。函数底层是通过C来实现、运算向量化,效率高apply函数对于向量,我们有sum、mean等函数对其进行计算。对于数组,如果我们想对其中一维(或若干维)进行某种计算,可以用行或列遍历操作函数apply。其一般形式为:apply(X,MARGIN,FUN,...)X:anarray,includingamatrix.MARGIN:1:行操作;2:列操作

FUN:函数名用apply可以很方便地按行列求和/平均,其结果与colMeans,colSums,rowMeans,rowSums是一样的。>a<-matrix(1:12,c(3,4))

>a

[,1][,2][,3][,4]

[1,]

1

4

7

10

[2,]

2

5

8

11

[3,]

3

6

9

12

>apply(a,1,sum)

[1]222630

>apply(a,2,sum)

[1]

6152433>apply(a,1,function(x)sum(x)+2)

[1]242832

如果函数FUN的结果是一个标量,MARGIN只有一个元素,则apply的结果是一个向量,其长度等于MARGIN指定维的长度,相当于固定MARGIN指定的那一维的每一个值而把其它维取出作为子数组或向量送入FUN中进行运算。a<-matrix(1:12,c(3,4))

>a

[,1][,2][,3][,4]

[1,]

1

4

7

10

[2,]

2

5

8

11

[3,]

3

6

9

12

>apply(a,1,function(x)x^2)

[,1][,2][,3]

[1,]

1

4

9

[2,]

16

25

36

[3,]

49

64

81

[4,]

100

121

144如果函数FUN的结果是一个长度为N的向量,则结果是一个维数向量等于c(N,dim(X)[MARGIN])的数组,注意这时不论是对哪一维计算,结果都放在了第一维。8.2内存管理object.size():了解R中的内存使用,给出一个R语言对象占用了多少字节的内存.y<-rnorm(10000)object.size(y)object.size("RHelloworld!")在windows平台下,memory.size()则报告内存中所有对象的总大小(MB为单位).memory.size()#[1]473.4使用函数memory.limit()获取或设置系统上的内存限制memory.limit()memory.limit(size=1080)内存清理使用gc()函数强制垃圾收集器运行,释放内存gc()使用rm()函数从环境中删除一个对象#主动删除一个较大的R内存对象rm(alargedat)8.3R并行计算随着数据量的日渐增大,R的内存使用方式和计算模式限制了R处理大规模数据的能力。从内存角度来看,R采用的是内存计算模式(In-Memory),被处理的数据需要预取到主存(RAM)中。其优点是计算效率高、速度快,但缺点是这样一来能处理的问题规模就非常有限(小于RAM的大小)。R的核心(Rcore)是一个单线程的程序。因此,在现代的多核处理器上,R无法有效地利用所有的计算内核。因此,在现代的多核处理器上,R无法有效地利用所有的计算内核。怎么破?并行计算!

并行计算技术正是为了在实际应用中解决单机内存容量和单核计算能力无法满足计算需求的问题而提出的。因此,并行计算技术常有力地扩充R的使用范围和场景。最新版R已经将parallel包设为了默认安装包。可见R核心开发组也对并行计算非常重视了。8.3R并行计算所有的商用计算机都使用并行处理来完成多任务!你的电脑有多少个CPU(核心)?library(parallel)#ComeswithR!detectCores(logical=F) #Num.ofphysicalcoresdetectCores(logical=T) #Num.offunctionalcores超线程CPU允许每个CPU芯片有两个功能CPU您可以可视化计算机上的CPU(和网络)活动:Windows:TaskManagerMac:ActivityMonitorparallel包简介

parallel包的思路和lapply函数很相似,都是将输入数据分割、计算、整合结果。只不过并行计算是用到了不同的cpu内核来运算。在parallel包里,对应上述两种并行化方式有如下两个核心函数(针对于lapply函数的并行化,mclapply在windows上不能使用):

parLapply(cl,x,FUN,...)mclapply(X,FUN,...,mc.cores)parallel包简介

不使用parallel进行并行计算fun<-function(x){return(x+1);}system.time({res<-lapply(1:5000000,fun);});

parallel包简介

使用parallel进行并行计算fun<-function(x){return(x+1);}#加载parallel包library(parallel)clnum<-detectCores()cl<-makeCluster(getOption("cl.cores",clnum));system.time({res<-parLapply(cl,1:5000000,fun)});stopCluster(cl);并行并不一定快虽然用户时间少了,

但系统时间增加了并行并不一定快下面利用Boston房价数据比较apply族函数和对应并行函数的效率并行并不一定快重复500次重复1000次foreach软件包foreach函数的工作方式与for循环类似。当apply族函数不能够满足需求时,foreach函数就可以派上用场,实际使用中,foreach的使用还需要doParallel包的配合。foreach()函数使用%dopar%命令并行执行循环,参数.combine用于指定所需的输出类型.节省了时间“令人尴尬的平行”适合:当您多次运行同一算法时,Bootstrap和重采样算法、for()循环、apply()函数、样本处理、优化例程、涉及许多重复分析的蒙特卡罗模不适合:运行单个montecarlo模拟、优化或MCMC后验估计节点之间的通信工作可以大大增加“处理”时间更多的CPU并不总是意味着更快权衡:传达的信息量一次迭代的时间工作节点数并行运行代码函数因Windows、MacOS、LINUX等而异。大多数软件包建议使用n–1个核预留一个给“master”软件包:‘parallel’(inbaseR,andbasedon‘snow’and‘multicore’)‘snow’(Windows)‘multicore’(MacOSandLinux)‘Snowfall’(moreintuitivefunctionsfor‘snow’withimprovedtroubleshootinganderrorlogging)‘doParallel’(usedwith‘foreach’package)并行实现标准方法:在n个worker节点中划分x个迭代,并预先将x/n块发送给每个worker负载均衡(LB):适用于在不同迭代之间处理时间变化幅度大或当工作节点具有不同的处理速度时使用程序可能会因为更高的通讯代价而变慢有些节点可能永远不会被“调用”并行基础设施主节点和工作节点组成一个集群如果网络是为集群计算而设计的,并且有许多(>>100)个工作节点(核心),那么它就是高性能计算(HPC)HPC注意事项大多数研究型大学都有HPC计算机设施运行R需要与HPC的计算机科学家合作不同大型机的基础架构有不同技术的实现不同的通讯要求r-sig-hpc@(RSIGonHigh-PerformanceComputing)大多数HPC设施需要运行时预订和使用时间限制使用并行化包

在R高性能计算列表

中已经列出了一些现有的并行化包和工具。用户使用这些并行化包可以像使用其他所有R包一样快捷方便,始终专注于所处理的问题本身,而不必考虑太多关于并行化实现以及性能提升的问题。我们以H2O.ai

为例。H2O后端使用Java实现多线程以及多机计算,前端的R接口简单清晰,用户只需要在加载包之后初始化H2O的线程数即可,后续的计算,如GBM,GLM,DeepLearning算法,将会自动被分配到多个线程以及多个CPU上。自带并行功能的软件包caret:预测模型集ranger:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论