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? 还有别的什么办法吗?