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? 还有别的什么办法吗?
R语言高性能编程(三)的更多相关文章
- R语言高性能编程,优化(一)
这段时间学习了<R高性能编程>这本书,基于这段时间做的项目实践,总结了一些自己的体会,和大家分享 一.为什么R程序有时候会很慢?1.计算性能的三个限制条件 cpu ram io R代码本身 ...
- R语言高性能编程(二)
接着上一篇 一.减少内存使用的简单方法1.重用对象而不多占用内存 y <- x 是指新变量y指向包含X的那个内存块,只有当y被修改时才会复制到新的内存块,一般来说只要向量没有被其他对象引用,就可 ...
- R语言实战(三)基本图形与基本统计分析
本文对应<R语言实战>第6章:基本图形:第7章:基本统计分析 =============================================================== ...
- R语言学习 第三篇:数据框
数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同.数据框的每列 ...
- R语言面向对象编程:S3和R6
一.基于S3的面向对象编程 基于S3的面向对象编程是一种基于泛型函数(generic function)的实现方式. 1.S3函数的创建 S3对象组成:generic(generic FUN)+met ...
- R语言数据管理(三):数据读入
R的数据读入非常灵活,即可以在R软件中直接输入,也可以读入外部数据. 一.直接输入数据 ①c()函数 ②scan()函数 其功能类似c()函数,scan()实际上是一种键盘输入数据函数.当输入scan ...
- R语言实战(三) 图形初阶
3.1 使用图形 plot:基础绘图 abline:添加回归直线 hist:绘制直方图 boxplot:绘制箱线图 dev.new():returns the return value of the ...
- R语言实战(三)——模拟随机游走数据
一.模拟随机游走数据示例 x <- matrix(0,1000,1) for(i in 1:1000){ x[i+1] <- x[i]+rnorm(1) } plot(x,type=&qu ...
- [读书笔记] R语言实战 (三) 图形初阶
创建图形,保存图形,修改特征:标题,坐标轴,标签,颜色,线条,符号,文本标注. 1. 一个简单的例子 #输出到图形到pdf文件 pdf("mygrapg.pdf") attach( ...
随机推荐
- Ubuntu16.04 install jdk-8u144-linux-x64.tar.gz
打开终端: Ctrl+Alt+T 下载jdk: wget http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b ...
- Message Queuing(MSMQ)
一.前言 MicroSoft Message Queuing(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...
- python 携带cookie访问网站(python接口测试post)
最近在使用自己研究性能测试工具的时候想到,使用python向服务器不断发送数据以作为并发测试.大概情况如下: #coding=utf-8 import urllib2 import urllib im ...
- Android Parcelable理解与使用(对象序列化)
http://my.oschina.net/zhoulc/blog/172163 parcel定义介绍: android提供了一种新的类型:parcel(英文解释:包裹,小包),本类用来封装数据的容器 ...
- 张高兴的 Windows 10 IoT 开发笔记:RTC 时钟模块 DS3231
GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/DS3231 注意:不包含闹钟设置
- [js插件开发教程]实现一个比较完整的开源级选项卡插件
在这篇文章中,我实现了一个基本的选项卡功能:请猛击后面的链接>> [js插件开发教程]原生js仿jquery架构扩展开发选项卡插件. 还缺少两个常用的切换(自动切换与透明度渐变),当然 ...
- C#实现软件开机自启动原理与代码
1.软件自启动原理 软件自启动的原理要从Windows的注册表聊起,在Windows操作系统下,主要有2个文件夹和8个注册表键项控制程序的自启动,这部分的详细介绍可以参看博客http://www.cn ...
- Iozone
参考地址:iozone使用技巧.iozone和Fio安装测试说明 iozone介绍 iozone(www.iozone.org)是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统 ...
- <Mastering KVM Virtualization>:第四章 使用libvirt创建你的第一台虚拟机
在第3章<搭建独立的KVM虚拟化>中,你安装并启动了libvirtd服务.你还引入了帮助你管理虚拟机的libvirt管理工具virt-manager和virsh. 相较于命令行,新用户总是 ...
- 【ASP.NET MVC 学习笔记】- 04 依赖注入(DI)
本文参考:http://www.cnblogs.com/willick/p/3223042.html 1.在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种"需 ...