一、使用并行计算加倍提升性能
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? 还有别的什么办法吗?