常用处理海量数据的思路和方法

一、Bloom filter(布隆过滤器)

适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集

基本原理及要点:
  对于原理来说很简单,(位数组+k个独立hash函数),将hash函数对应的值数组的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。

所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了

还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小及hash函数个数。当hash函数个数k=(ln2)(m/n)时错误率最小。在错误率不大于E的情况下,m至少要等于nlg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。

举个例子我们假设错误率为0.01,则此时m应大概是n的13倍。这样k大概是8个。

注意这里m与n的单位不同,m是bit为单位,而n则是以元素个数为单位(准确的说是不同元素的个数)。通常单个元素的长度都是有很多bit的。所以使用bloom filter内存上通常都是节省的。

扩展:
  Bloom filter将集合中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个集合中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter中的最小值来近似表示元素的出现频率

问题实例:给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?

根据这个问题我们来计算下内存的占用,4G=2^32大概是40亿*8大概是340亿,n=50亿,如果按出错率0.01算需要的大概是650亿个bit。现在可用的是340亿,相差并不多,这样可能会使出错率上升些。另外如果这些urlip是一一对应的,就可以转换成ip,则大大简单了。

二、Hashing

适用范围:快速查找,删除的基本数据结构,通常需要总数据量可以放入内存

基本原理及要点:
  hash函数选择,针对字符串,整数,排列,具体相应的hash方法。
  碰撞处理,一种是open hashing,也称为拉链法;另一种就是closed hashing,也称开地址法,opened addressing。

扩展:
  d-left hashing中的d是多个的意思,我们先简化这个问题,看一看2-left hashing。2-left hashing指的是将一个哈希表分成长度相等的两半,分别叫做T1和T2,给T1和T2分别配备一个哈希函数,h1和h2。在存储一个新的key时,同时用两个哈希函数进行计算,得出两个地址h1[key]和h2[key]。这时需要检查T1中的h1[key]位置和T2中的h2[key]位置,哪一个位置已经存储的(有碰撞的)key比较多,然后将新key存储在负载少的位置。如果两边一样多,比如两个位置都为空或者都存储了一个key,就把新key存储在左边的T1子表中,2-left也由此而来。在查找一个key时,必须进行两次hash,同时查找两个位置。

问题实例:
  1).海量日志数据,提取出某日访问百度次数最多的那个IP。
  IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。

三、bit-map

适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下

基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码

扩展:bloom filter可以看做是对bit-map的扩展

问题实例:
  1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
  8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。
  2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map。

四、堆

适用范围:海量数据前n大,并且n比较小,堆可以放入内存

基本原理及要点:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元素。这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。

扩展:双堆,一个最大堆与一个最小堆结合,可以用来维护中位数。

问题实例:
  1)100w个数中找最大的前100个数。
  用一个100个元素大小的最小堆即可。

五、双层桶划分----其实本质上就是【分而治之】的思想,重在“分”的技巧上!

适用范围:第k大,中位数,不重复或重复的数字
  基本原理及要点:因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。可以通过多次缩小,双层只是一个例子。

扩展:
  问题实例:
  1).2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
  有点像鸽巢原理,整数个数为232,也就是,我们可以将这232个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。

2).5亿个int找它们的中位数。
  这个例子比上面那个更明显。首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。

实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受的程度。即可以先将int64分成224个区域,然后确定区域的第几大数,在将该区域分成220个子区域,然后确定是子区域的第几大数,然后子区域里的数的个数只有2^20,就可以直接利用direct addr table进行统计了。

六、数据库索引

适用范围:大数据量的增删改查

基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。

七、倒排索引(Inverted index)

适用范围:搜索引擎,关键字查询

基本原理及要点:为何叫倒排索引?一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。

以英文为例,下面是要被索引的文本:
T0 = “it is what it is”
T1 = “what is it”
T2 = “it is a banana”

我们就能得到下面的反向文件索引:

“a”: {2}
“banana”: {2}
“is”: {0, 1, 2}
“it”: {0, 1, 2}
“what”: {0, 1}

检索的条件"what","is"和"it"将对应集合的交集。

正向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说文档指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系。

扩展:
  问题实例:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。

八、外排序

适用范围:大数据的排序,去重

基本原理及要点:外排序的归并方法置换选择败者树原理,最优归并树

扩展:

问题实例:
  1).有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。

这个数据具有很明显的特点,词的大小为16个字节,但是内存只有1m做hash有些不够,所以可以用来排序。内存可以当输入缓冲区使用。

九、trie树

适用范围:数据量大,重复多,但是数据种类小可以放入内存

基本原理及要点:实现方式,节点孩子的表示方式

扩展:压缩实现。

问题实例:
  1).有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序。
  2).1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?
  3).寻找热门查询:查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。

十、分布式处理 mapreduce

适用范围:数据量大,但是数据种类小可以放入内存

基本原理及要点:将数据交给不同的机器去处理,数据划分,结果归约。

扩展:
  问题实例:
  1).The canonical example application of MapReduce is a process to count the appearances of
each different word in a set of documents:
  2).海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
  3).一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数的中数(median)?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据分析 定义:是指用适当的统计分析方法对收集来的大量数据进行分析,将它们加以汇总和理 解并消化,以求最大化地开发数据的功能,发挥数据的作用。数据分析是为了提取有用 信息和形成结论而对数据加以详细研究和概括总结的过程。 目的:把隐藏在一大批看似杂乱无章的数据背后的信息集和提炼出来,总结出所研究 对象的内在规律,帮助管理者进行判断和决策。 作用:现状分析、原因分析和预测分析 步骤:明确分析目的与框架、数据收集、数据处理数据分析、数据展现和撰写报告等 6个阶段。 1、明确分析目的与框架 一个分析项目,你的数据对象是谁?分析目的是什么?要解决什么业务问题?目的明确 之后,就可以梳理分析思路整理分析框架。不同的项目对数据的要求,使用的分析手段 是不一样的。所以这些是进行数据分析的方向和前提。 2、数据收集 数据收集是按照确定的数据分析目的和框架内容,有目的的收集、整合相关数据的一个 过程,它是数据分析的一个基础。 3、数据处理 数据处理是指对收集到的数据进行加工、整理,以便开展数据分析,它是数据分析前必 不可少的阶段。这个过程是数据分析整个过程最占据时间的,也在一定程度上取决于 数据仓库的搭建和数据质量的保证。数据处理主要包括数据清洗、数据转化、数据提取数据计算等处理方法。 4、数据分析 数据分析是指通过分析手段、方法和技巧对处理过好的数据进行探索、分析,提取有价 值的信息,从发现因果关系、内部联系和业务规律。 这个阶段就要涉及到工具和方法的使用。其一要熟悉常规数据分析方法,如方差、回归 、因子、聚类、分类、时间序列等,这些我在学校可以学习。其二是熟悉数据分析工具 ,Excel最常见,还有专业的分析软件,如数据分析工具SPSS/SAS/R/Matlab等,便于进 行一些专业的统计分析、数据建模等。 5、数据展现 一般情况下,数据分析的结果都是通过图、表的方式来呈现,借助数据展现手段,能更 直观的让数据分析师表述想要呈现的信息、观点和建议。 常用的图表包括饼图、折线图、柱形图/条形图、散点图、雷达图等、金字塔图、矩阵图 、漏斗图、帕雷托图等。 6、撰写报告 最后阶段,就是撰写数据分析报告,这是对整个数据分析成果的一个呈现。通过分析报 告,把数据分析的目的、过程、结果及方案完整呈现出来,以供商业目的提供参考。 一份好的数据分析报告,首先需要有一个好的分析框架,并且图文并茂,层次明晰,能 够让阅读者一目了然。另外,数据分析报告需要有明确的结论、建议和解决方案,不仅 仅是找出问题,后者是更重要的,否则称不上好的分析,同时也失去了报告的意义。 数据挖掘(Data Mining) 数据挖掘是知识发现(KDD)的一个关键步骤。一般是指从数据库的海量数据通过算法 揭示出隐含的、先前未知的并有潜在价值的信息的过程。它是一种决策支持过程,主要 基于人工智能、机器学习、模式识别、统计学、数据库、可视化技术等。 数据挖掘的定义分为技术上的定义和商业定义: 1.技术上的定义及含义 数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据,提 取隐含在其的、人们事先不知道的、但又是潜在有用的信息和知识的过程。这个定义 包括好几层含义:数据源必须是真实的、大量的、含噪声的;发现的是用户感兴趣的知 识;发现的知识要可接受、可理解、可运用;并不要求发现放之四海皆准的知识,仅支 持特定的发现问题。 2.商业角度的定义 按企业既定业务目标,对大量的企业数据进行探索和分析,揭示隐藏的、未知的或验 证已知的规律性,并进一步将其模型化的先进有效的方法数据挖掘任务有两类: 一:描述性挖掘任务:刻画数据数据的一般特性; 二:预测性挖掘任务:在当前数据的基础上进行推断,以进行预测。 数据挖掘常用方法: 利用数据挖掘进行数据分析常用方法主要有分类、回归分析、聚类、关联规则、特征 、变化和偏差分析、Web页挖掘等, 它们分别从不同的角度对数据进行挖掘。 1、分类 分类是找出数据一组数据对象的共同特点并按照分类模式将其划分为不同的类,其 目的是通过分类模型,将数据数据项映射到某个给定的类别。它可以应用到客户 的分类、客户的属性和特征分析、客户满意度分析、客户的购买趋势预测等,如一个汽 车零售商将客户按照对汽车的喜好划分成不同的类,这样营销人员就可以将新型汽车的 广告手册直接邮寄到有这种喜好的客户手,从而大大增加了商业机会。 2、回归分析 回归分析方法反映的是事务数据属性值在时间上的特征,产生一个将数据项映射到 一个实值预测变量的函数,发现变量或属性间的依赖关系,其主要研究问题包括数据序 列的趋势特征、数据序列的预测以及数据间的相关关系等。它可以应用到市场营销的各 个方面,如客户寻求、保持和预防客户流失活动、产品生命周期分析、销售趋势

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值