R语言高性能编程(三)

一、使用并行计算加倍提升性能
1、数据并行 VS 任务并行
实现数据并行的算法
scoket 并行性
注意并行计算时间并不与执行任务的计算资源数目成正比(计算机核心),amdahl定律:并行代码的速度受限于串行执行的部分,包括并行性带来的开销
在非windows系统中,parallel支持分叉集群(交叉法),新的work进程会从父R进程分叉出来,并拷贝数据。好处是不需要显示的创建和销毁集群
实现任务并行的算法

2、计算机集群并行执行多个任务
只有基于socket的集群可以做到这一点,因为进程不可能被分叉到另外一台机器。由于计算机集群必须通过网络通信,所以网络的带宽和延迟对整个集群的性能
非常重要。所以在多个物理机的情况下 ,应该把所有节点部署在同一个网段内更合理

3、共享内存并行性 VS 分布式内存并行性
分布式内存并行性中 每个进程都有自己堵路的内存空间,换句话说,每个进程都要有自己的数据拷贝,即使这些进程处理的是相同的数据。
这样的话在单个计算机的多个进程运行并行代码,这会导致极大的冗余。交叉集群没这个问题,socker集群,创建了新的R实例,所以每个worker都有数据拷贝。

共享内存并行性 所有的worker进程共享单份数据拷贝。虽然parallel 包不支持共享内存并行性,但是可以通过调整数据结构来支持,bigmemory中的big.matrix对象的cran包
一定要注意避免竞争条件,即worker进程读写相同内存位置,由于协调不当导致冲突和程序错误。

4、优化并行的可能
主要障碍就是master和worker之间的数据传递和拷贝。
1、就是使用共享内存并行性
2、数据压缩 
3、将数据保存在每个worker节点,只保留中间节点的数据通信 类似于MR

二、将数据处理交给数据库系统
一个很大的数据集存储在数据库中,将所有的数据抽取到R里面是不现实的
1、将数据抽取到R VS 在数据库中处理数据
从关系型数据库中使用sql进行数据预处理
dplyr 和 pivotalR 可以将R表达式转化为SQL
2、在数据库中运行统计和机器学习算法
madlib 想postgresql 添加了高级统计功能,不支持windows,只需一个简单的数据库规则,即可在数据库端计算,将计算结果加载到windows
3、使用列式数据库提升性能
这种方式目前并不太适合我们的业务
4、使用数据库阵列最大化科学计算的性能
针对多维模型是运用

三、展开联想,R和大数据
HDFS 存储数据,按块存储(128M),默认3个副本,保证了高度可用性
MR 数据并行的方式处理hdfs上的数据,和第八点很像,但是MR的优势是数据已经存储在worker节点上而不需要每次运行任务的时候分发
但是,每次读取需要从硬盘获取数据,然后在写回磁盘。所以完成计算时间超过了读写数据的开销以及运行hadoop集群的开销。
具体不在细说,因为大数据的生态体系已经很大了,不是一个人一两天可以说清楚的。

使用Rhadoop分析HDFS数据
使用rmr2函数读取文件make.input.format(),还可以读取原生文本,json,hadoop序列化文件,hbase我,hive,pig。
除了rhdfs和rmr2外,还有
plyrmr:mr上的plyr功能
rhbase:提供处理rhbase数据的函数
ravro:读写avro格式的数据

到这里已经全部介绍完了高性能编程的核心知识。

关于海量数据,在R无论如何优化也R满足不了的情况,比如针对我们的业务  高考单卷种500W 考生 单科目 * 100个小题   5亿离线数据量  ,再加上历次共有几十亿数据量。

这时个人觉得再用R优化,增加硬件性能也是指标不治本的情况,上大数据吧,我们应该形成自己的数据仓库,存放历史数据,形成产品,这样才能做大,做强!

PS:当时选用R就是为了解决像DIF、信度、测量标准误差、相关系数等方面的算法问题,抛弃R,如何解决算法问题呢。在算法不能拆分的情况下,如何分布式计算相关系数?

sparkR? 还有别的什么办法吗?

时间: 2024-11-05 20:29:05

R语言高性能编程(三)的相关文章

R语言高性能编程(二)

接着上一篇 一.减少内存使用的简单方法1.重用对象而不多占用内存 y <- x 是指新变量y指向包含X的那个内存块,只有当y被修改时才会复制到新的内存块,一般来说只要向量没有被其他对象引用,就可以正常修改,以避免复制向量带来的CPU和RAM开销.按照程序属于来说,R是按值传递,应该避免使用sort 类似的函数,会返回一个副本,资源开销至少和原对象一样大,甚至更大2.删除不在需要的中间数据注意 在调用rm()的时候,内存不会被立即释放并交还到操作系统,而是在必要的时候,或者当已删除对象的内存量超过

R语言基础编程技巧汇编 - 26

1.      监视R语言包更新状态的网站 R语言包的数量已经有近万个,及时关注新发布的包,以及已发布的包的更新状态,非常重要,下列网站提供了这个功能,读者可以经常访问: http://lib.stat.cmu.edu/R/CRAN/web/packages/available_packages_by_date.html 2.      使用命令行参数的R程序示例 以Windows系统为例,按照以下步骤: 1.    把Rscript.exe的路径加入到Path环境变量中,在我的机器上设置如下:

R语言基础编程技巧汇编 - 17

1.       timestamp函数输出当前时间 timestamp() ##------ Sun Apr 05 20:54:06 2015 ------## 该函数可以输入当前的系统时间,可用于耗时很长的程序定时输出当前时间,用于判断程序是否正常运行:也可用于调试,判断哪一段代码效率较低. 2.       多个比较的boxplot图 a=c(1,2,3,4,5,2,1,2,4,2,5,6) b=c("A","A","B","B&

R语言基础编程技巧汇编 - 前言

前 言 R语言是近年来迅速崛起的用于数据分析和数据挖据的编程语言,它由一批统计学家开发,进而广泛应用于各种需要进行统计分析的行业.在大数据时代,其优雅的编码风格.包罗万象的开发包.强大的数据处理能力,吸引了来自各个领域从事数据分析相关工作的人员. R语言是强大自由的,但是其学习曲线也是陡峭的.本人具有C/C++,C#,Python等多种语言的开发经验,就本人的体会,从R语言初级开发水平进阶到中级开发水平,要比其他编程语言更加困难,往往很多初学者就在这个阶段放弃了,相当可惜.另外,对于大量没有很多

R语言基础编程技巧汇编 - 25

1.      使用rClr包访问.NET库 下载地址:http://r2clr.codeplex.com/ library(rClr) clrLoadAssembly('c:/path/to/myassembly.dll') myObj <-clrNew('MyNamespace.MyClass,MyAssemblyName') clrCall(myObj, 'SayHelloWorld') 2.      向C语言代码传递数据框参数示例 data.frame是一个list对象 #includ

R语言基础编程技巧汇编 - 20

1.      RCurl设置代理 假设代理地址是10.10.10.10:端口是:8080. 设置代理地址如下: curl<-getCurlHandle(proxy="10.10.10.10:8080"); getURL("http://baidu.com",curl=curl) 2.      抓取网页中的表格 library(XML) library(RCurl) u ="http://en.wikipedia.org/wiki/List_of_

R语言基础编程技巧汇编 - 27

1.      向量循环移位 library("magic") x <- 1:10 magic::shift(x,1) # [1] 10 1  2  3 4  5  6 7  8  9 magic::shift(x,1) # [1] 10 1  2  3 4  5  6 7  8  9 magic::shift(x,2) # [1] 9 10  1  2 3  4  5 6  7  8 magic::shift(x,3) # [1] 8  9 10  1 2  3  4 5  6

R语言面向对象编程:S3和R6

一.基于S3的面向对象编程 基于S3的面向对象编程是一种基于泛型函数(generic function)的实现方式. 1.S3函数的创建 S3对象组成:generic(generic FUN)+method(generic.class FUN) 泛型函数(generic)创建示例: get_n_elements <- function(x,...) { UseMethod("get_n_elements") } 通常用UseMethod()函数定义一个泛型函数的名称,通过传入参数

R语言基础编程技巧汇编 - 16

1.      利用magrittr包进行管道操作 很多情况下,管道操作符可以很大程度的简化代码,并且使其更加直观.易读.易懂,下面就简单说明了useR2014上颇受R用户喜爱的magrittr包. the pipe operatoris one (if not THE) most important innovation introduced, this year, to the Recosystem Intro 类似于linux中的|,可以把前一个表达式(函数)的输出(而不用定义中间变量来表