作者:手机用户2502935311 | 来源:互联网 | 2023-08-06 16:16
好多朋友问R语言能不能处理大数据,这个问题比较难说,关键在于怎么定义大数据和怎么算是可以处理。R是一种语言,也就是工具,并且是运行在电脑上的,电脑性能也决定运行结果,不过这些都是废
好多朋友问R语言能不能处理大数据,这个问题比较难说,关键在于怎么定义大数据和怎么算是可以处理。R是一种语言,也就是工具,并且是运行在电脑上的,电脑性能也决定运行结果,不过这些都是废话,说点实际的吧,如何提高用R语言处理分析数据的效率?
简单说,三点:
1)换更快的电脑,
2)学习使用各种高效的package,
3)使用Revolution R代替原生的R程序。
第一点就可以省略啦,从2说起吧。
1. 学习使用适合处理大数据的R package
大家都知道,R语言的主要优势在于各种包,有的包可以极大的提高工作效率,个人最爱的3个包:和data.table,Rcpp(+RArmadillo),和parallel。
data.table
R里面最重要的内置数据类型就是data.frame了,data.frame本质是一个list,因为list是不要求元素的类型一致,所以data.frame可以存储不同类型的数据在不同的column,比如
> df1=data.frame(c(1,2,3),c('李大猫','王大锤','一个狗'))
> df1
c.1..2..3. c..李大猫....王大锤....一个狗..
1 1 李大猫
2 2 王大锤
3 3 一个狗
df1有两列,第一列示numeric类型,第二类是character类型。
从形式上来说,data.frame长的和matrix很像,但是一个matrix只能存储一种类型数据,在一定情况下,matrix和data.frame是可以互相转化的,比如用as.data.frame()函数把一个matrix变成data.frame,或者用data.matrix从一个data.frame提取出matrix。这里一个建议,只要可以用matrix的地方,就尽量用matrix而不是data.frame,因为R对matrix的运算比data.frame更高效。
回到data.table这个包的话题,data.table是做什么的?data.table可以说是提供data.frame的替代品,更高效,速度可以说是飞快。这里有一个R的data.table,dplyr和python的pandas包处理50GB数据的时间对比:
https://github.com/Rdatatable/data.table/wiki/Benchmarks-%3A-Grouping
对50GB但数据进行同样的数据处理,data.table用了15分钟,dplyr用了51分钟,pandas用了31分钟。R的data.table完胜。
关于data.table的使用,可以写几篇文章,所以这里就先不展开说了 ,具体参见:
https://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdf
https://s3.amazonaws.com/assets.datacamp.com/img/blog/data+table+cheat+sheet.pdf
里面有很多用例。
Rcpp(+RArmadillo)可以让使用者直接写c++函数,在R中调用,某些具体问题也可以极大的提高运算速度。
parallel是一个并行计算包,用在linux/mac下面,windows系统可以用snow,功能类似,但是更喜欢linux的fork方式。
2. Revolution R
Revolution R是什么?Revolution Analytics是一个公司,不久前被微软收购,这个公司在R基础上开发了Revolution R,可以理解为另一个R版本。Revolution R相比原生的R有什么优势呢?R本身是单线程的,为了利用多核心cpu,可以用各种并行计算包,如上面提起的parallel/snow等。但是这些都要写额外的代码,有没有什么办法不用改变任何代码来提高运行效率呢?有,Revolution R就是一个解决方案。
那么如何使用Revolution R?首先去https://mran.revolutionanalytics.com/download/
下载Revolution R,注意要先安装MRO 3.2.3 & MKL 来使用Interl的MKL库。然后就可以像是使用原生的R一样来使用Revolution R了,如果电脑已经安装了Rstudio,Rstuido可以自动识别Revolution R,就是说可以在Rstudio里面直接使用Revolution R,不需要任何设置。
关于速度对比,请看下表,列举了几个基本运算使用原生R和Revolution R的速度对比:
可以看到涉及到matrix运算时,Revolution R有显著作用,这主要是因为矩阵相关运算使用了MKL库。
Revolution R可以设置使用几个cpu核心,通过函数setMKLthreads()来选择。