R处理大数据集
R会把所有的对象读存入虚拟内存中。对我们大多数用户来说,这种设计可以提高与R相互的速度,但是当分析大数据集时,这种设计会降低程序运行速度有时还会产生跟内存相关的错误。 内存限制主要取决于R的build版(32位还是64位),而在32位的windows下,取决于操作系统的版本。以cannot allocate vectoe of size开头的出错信息表示无法分配充足的连续内存,而以cannot allocate vector of length开头的出错信息表示超越了地址限制(address limit)。在处理大数据集时,应尽量使用64位版的R。对于各种build版,向量中的元素个数最大为2147483647(请自行?Memory)。 在处理大数据集时有三方面应该考虑:(a)提高程序的效率,保证执行速度;(b)把数据储存在外部,以解决内存限制问题;(c)使用专门的统计方法来有效处理大数据量的问题。 下面将分别讨论。 高效编程下面几条编程技巧来可以提高处理大数据集时的效率
- 尽量向量化运算。使用R内置的函数来处理向量、矩阵和list(例如函数sapply,lapply和mapply),尽量避免使用循环(for和while);
- 使用矩阵,必要时才使用数据框,因为矩阵的开销更少;
- 使用read.table()函数族把外部数据导入数据框时,尽量显式设定colClasses和nrows选项,设定comment.char = "",把不需要的列设置成NULL。这样可以减少占用的内存,同时加快处理速度。将外部数据导入矩阵时,使用scan()函数;
- 在处理全部数据前,用数据的子集测试程序,来优化程序,去掉bug;
- 删除临时对象和不再用的对象。调用rm(list=ls())可以删除内存中的所有对象。删除指定的对象可以用rm(object);
- 在Jeromy Anglim的博客文章“R的内存管理:一些小窍门和技巧”(原文Memory Management in R: A Few Tips and Tricks,被墙)中提到,使用函数.ls.objects()列出工作区内的对象占用的内存大小。这个函数会帮助你找到吃内存的大家伙。
- profile你的程序,看看在每个函数中花的时间。你可以用Rprof()和summaryRprof()函数完成这项工作。system.time()函数也可以帮助你。profr 和 prooftools 包提供了若干函数来帮助分析profile的输出。
- Rcpp包可以把R对象转成C++函数(原文是The Rcpp package can be used to transfer R objects to C++ functions and back when more optimized subroutines are needed. 后半句不知怎么翻译)
处理大数据集,提高代码效率只能解决一部分问题。你也可以把数据存在外部存储并使用专门的统计分析方法。 把数据存储在内存之外有几种包可以实现在内存之外存储数据。解决之道是把数据保存在外部数据库或者硬盘里的二进制文件中,然后在需要的时候部分地读取。下表描述了几种有用的包:
| 包 | 描述 |
| ff | 提供了一种数据结构,保存在硬盘中,但是操作起来就如同在内存中一样 |
| bigmemory | 支持大规模矩阵的创建、储存、读取和操作。矩阵被分配到共享内存或内存映射的文件中(memory-mapped files) |
| filehash | 实现了简单的key-value数据库,在其中特征字符串key与存储在硬盘中的数据value相关联。 |
| ncdf, ncdf4 | Provides an interface to Unidata netCDF data files. |
| RODBC, RMySQL, ROracle, RPostgreSQL, RSQLite | 可以用这些包读取外部关系数据库管理系统的数据 |
上面的包可以帮助客服R的内存限制。除此以外,当需要在有限时间内分析大数据集时,使用专门方法也是必须的。一些有用的方法将在下面介绍。 分析大数据集的包R提供了几种分析大数据集的包:
- biglm 和 speedglm 包可以针对大数据集有效地拟合线性和广义线性模型。在处理大规模数据集时,这两个包提供了类似lm()和glm()的功能。
- 由 bigmemory 包可产生大规模矩阵,一些包可以提供分析这些大规模矩阵的函数。bigannalytics 包提供了k-means聚类、行统计量(column statistics)和一个对biglm()的封装。bigtabulate 包提供了table()、split()和tapply()的功能,bigalgebra 包提供了高等线性代数的函数。
- biglars 包提供了最小角回归(least-angle regression)、lasso以及针对大数据集的逐步回归,数据集因太大而不能读入到内存中,这时候要配合 ff 包使用。
- Brobdingnag 包可以用来处理大数字(大于2^1024)
处理从GB到TB级的数据对于任何数据都是极大的挑战。如果想查看R的更多方法,请看CRAN task View: High-Performance and Parallel Computing with R (http://cran.r-project.org/web/view)。
转 用R处理大数据集
R处理大数据集的更多相关文章
- R语言︱大数据集下运行内存管理
在实操时出现以下的问题: Error: cannot allocate vector of size 2.9GB 大神指导(http://bbs.pinggu.org/thread-3682816-1 ...
- 全网最详细的大数据集群环境下如何正确安装并配置多个不同版本的Cloudera Hue(图文详解)
不多说,直接上干货! 为什么要写这么一篇博文呢? 是因为啊,对于Hue不同版本之间,其实,差异还是相对来说有点大的,具体,大家在使用的时候亲身体会就知道了,比如一些提示和界面. 全网最详细的大数据集群 ...
- Ubuntu14.04下Ambari安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)
不多说,直接上干货! 写在前面的话 (1) 最近一段时间,因担任我团队实验室的大数据环境集群真实物理机器工作,至此,本人秉持负责.认真和细心的态度,先分别在虚拟机上模拟搭建ambari(基于CentO ...
- NASNet学习笔记—— 核心一:延续NAS论文的核心机制使得能够自动产生网络结构; 核心二:采用resnet和Inception重复使用block结构思想; 核心三:利用迁移学习将生成的网络迁移到大数据集上提出一个new search space。
from:https://blog.csdn.net/xjz18298268521/article/details/79079008 NASNet总结 论文:<Learning Transfer ...
- 大数据集群Linux CentOS 7.6 系统调优篇
大数据集群Linux CentOS 7.6 系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设置主机hosts文件 1>.修改主机名 [root@node100 ...
- 使用ansible部署CDH 5.15.1大数据集群
使用ansible离线部署CDH 5.15.1大数据集群 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在此之前,我之前分享过使用shell自定义脚本部署大数据集群,不管是部署CD ...
- 【Hadoop离线基础总结】大数据集群环境准备
大数据集群环境准备 三台虚拟机关闭防火墙 centOS 7 service firewalld stop ->关闭防火墙 chkconfig firewalld off ->开机关闭防火墙 ...
- 实战|Hadoop大数据集群搭建
一个执着于技术的公众号 前言 今天来为粉丝圆梦啦 话不多说,咱直接进入实战环节 实验环境: 主机名 IP地址 角色 qll251 192.16 ...
- FineReport层式报表解决大数据集展示问题攻略
本文以填报报表为例,通过分页的方式,来解决大数据集展示的问题. 实现的思想就是通过在SQL里筛选部分数据库数据,以达到浏览器可以合理的展示报表页面.(数据分段,语句我这采用的是MYSQL,如果要用其他 ...
随机推荐
- lufylegend库 LGraphics
lufylegend库 LGraphics <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- 触摸滑动插件 Swiper
Swiper Swiper 是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端. Swiper中文网里已有详细的使用介绍,我就不多做介绍了. http://www.swiper ...
- 【Spring-web】AsyncRestTemplate源码学习
2017-01-23 by 安静的下雪天 http://www.cnblogs.com/quiet-snowy-day/p/6343347.html 本篇概要 类说明 类图 简单例子 精辟的内部类 类 ...
- WebForm 控件(一)、连接数据库
一.控件 [简单控件] (一)文字显示 1.Label → 在html中相当于span <asp:Label ID="控件名 runat="server" Tex ...
- Python学习--15 日期和时间
获取当前时间 # coding: utf-8 from datetime import datetime now = datetime.now() print(now) print(now.strft ...
- 自己动手系列——实现一个简单的ArrayList
ArrayList是Java集合框架中一个经典的实现类.他比起常用的数组而言,明显的优点在于,可以随意的添加和删除元素而不需考虑数组的大小.处于练手的目的,实现一个简单的ArrayList,并且把实现 ...
- (3)activiti流程的挂起和激活
有时候,我们需要对一个已经执行的流程进行暂停,而不是删除它,这个时候就需要我们调用activiti暂停和激活的api来操作他们 每启动一个流程实例,都会在该流程实例下产生相应的流程任务,处于1*多的关 ...
- jQuery的拾色器
代码如下 1.js <link href="css/farbtastic.css" rel="stylesheet" /> <script t ...
- java-6数组
一. 请编写一个程序将一个整数转换为汉字读法字符串.比如"1123"转换为"一千一百二十三".更进一步,能否将数字表示的金额改为"汉字表达?比如将&q ...
- CSS3 3D的总结(初学者易懂)
CSS3 3D案例的总结 如果要说是3D的基础概念,首先我就来说一说rotateX().rotateY().rotateZ()这几个属性 rotateX():对应的是3D模型中的X轴上的旋转,传入的参 ...