海量数据处理~

来源:互联网 发布:尘埃落定 知乎 编辑:程序博客网 时间:2024/06/07 03:42

海量数据,意思就是数据数量大,一般来说呢,就可以考虑哈希算法~

那么,哈希算法是什么嘞?它也叫做散列函数,顾名思义,把一组数据散列开,常用的方法就是模值取余法,例如,一组数据{0,1,2,3,4,5,6,7},可以散列成两组,模2得0的和模2得1的{0,2,4,6},{1,3,5,7};

OK,言归正传,说海量数据的事~

一、经典思路:分而治之/hash映射 + hash统计 + 堆/快速/归并排序

举个例子叭~

例1、海量日志数据,提取出某日访问百度次数最多的那个IP

简单粗暴的方案1:众所周知,IP是32位的,那也就是说,IP一共会有2^32种情况,直接分配一个2^32的内存,然后进行模上2^32,再进行哈希统计。

心思缜密的方案2:


很多问题都可以套路方案2呢,总之记住一点,分组一定得保证相同的在一个组里,不然没办法统计。还有一个小点,如果不是整型,而是字符串呢,总不好直接模整型吧,解决办法:

(1)字符串的ASCII值相加。例如呢,"abc" = 97+ 98+ 99;

(2)字符串的ASCII值乘以系数相加,例如呢,"abc" = 97*(2^2)+ 98*(2^1)+ 99*(2^0);

例2:给定ab两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出ab文件共同的url

还是采用经典思路的方法,但是不同的是,两个文件采用相同的哈希映射法(即模的数要相同),相同的余数组成一对,进行哈希统计即可。

二、Bloom filter/Bitmap

1、Bloom filter【布隆过滤器】:优点是利用正确率换取时间和空间,用在“找寻一个数字是否在这个数列里”这种查重问题特别方便。

2、基本思想:多个哈希函数一起映射。

3、40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

 
所以,很明显,Bloom filter最大的缺点是不能删除数据,因为你对应的bit位有可能牵扯到其他数据,最大的优点就是,你再找数据的时候,就放Bain多了。
三、Tire树
适用范围:数据量大,重复多,但是数据种类小可以放入内存。
四、数据库索引
适用范围:大数据量的增删改查
五、倒排索引
适用范围:搜索引擎,关键字查询
基本原理及要点:一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
以英文为例,下面是要被索引的文本:
 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最经典的啦~~~~

原创粉丝点击