海量数据处理:分治-Hash映射+Bit-map+Bloome Filter

来源:互联网 发布:张译 知乎回答的问题 编辑:程序博客网 时间:2024/06/17 21:03

    海量数据处理,就是基于海量数据的查找/统计/运算等操作。海量数据顾名思义,就是有大量的数据,不能一次性装入内存处理,导致传统的操作无法实现。对于海量数据的处理,这里将三个,分别是分治--Hash映射/Bit-map/Bloome Filter。


 1.  分治-Hash映射


    如果两个散列值不同,那么这两个散列值的原始输入也是不同的。

    基本思想:对于大文件进行处理时,如果文件比较大,无法一次性读入内存,可以考虑采取Hash映射的方式将文件中的元素映射到不同小文件中,然后依次处理各个小文件,最后合并结果,这样降低了问题的规模。


2.Bit-map


    Bit-map的原理就是用位数组来表示某元素是否存在,由于采用了bit为单位来存储数据,因此在存储空间方面,可以大大节约空间,可用于海量数据的快速查找/判重/删除等。

   

3.Bloome Filter

    之前转载过一篇博客介绍将Bloome Filter用于url去重,我们之前做的爬虫去重的方式是将历史的url存入了Leveldb数据库中,随着数据库的元素的增加,需要查找的时间边长,严重的影响了网页抓取的速度。所以考虑使用Bloome Filter。

    Bloome Filter中文叫布隆过滤器,可以看作是Bit-map的拓展。Bit-map的作法是申请一个N位(N为集合中最大整数)的数组,然后每一位对应一个特定整数。

    Bloome Filter的基本原理是位数组与Hash函数的联合使用。Bloome Filter是一个包含了m位的位数组,数组的每一位都初始化为0,然后定义k个不同的Hash函数,每个Hash函数都可以将集合中的元素映射到数组中的每一位。当向集合中插入一个元素时,根据k个Hash函数就可以得到位数组的k个位,将这些位全部设置为1。当要查询某个元素是否在集合中时,就使用k个哈希函数得到此元素对应的k个位,如果所有点都是1,那么元素在集合内,如果有0,元素不在集合内。


    举个例子:n个元素的集合为S={x1,x2,...,xn},查找元素y是否在集合S中。

    第一步,初始化。Bloome Filter使用k个相互独立的哈希函数,位数组的长度为m,数组中每一位被初始化为0。有关k,m参数的确定,可以参考文献。

    第二步,将集合中每个元素根据Hash函数映射到k个位置上,将这些位置置1,如果原来是1,则不用置1。如图所示:

    这里写图片描述

    第三步,判断y是否在集合中。对y应用k次哈希函数,如果所有的hi(y)的位置都是1(1<= i <= k),则认为y是集合中的元素,否则就认为y不是集合中的元素。

    通常Bloome Filter的位数m比Bit-map的m小的多,是一种空间效率和时间效率很高的随机数据结构,但是是以牺牲正确率为代价的。即Bloome Filter通过极小的错误换取了存储空间的极大节省。Bloome Filter不适合那些零错误的应用场合。



参考《王道程序员求职宝典》

原创粉丝点击