文章目录
1. 十个大数据量处理方法总结
1.1 Bloom filter(布隆过滤器)
推荐阅读:详解布隆过滤器的原理,使用场景和注意事项
适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集
基本原理及要点:位数组 + k 个独立的 hash 函数,插入时,将 hash 函数对应的位变成1。查找时,如果发现所有的 hash 函数对应位都是1,则说明有可能存在(有错误率),但如果发现有对应位上为0,则说明一定不存在。
问题实例:
1)给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。
如果允许一定的错误率,则可以将其中一个文件的 url 使用布隆过滤器映射到位数组中,然后挨个读取另一个文件的 url,检查在布隆过滤器中是否出现过。
1.2 Hashing
适用范围:快速查找、删除的基本数据结构,通常需要 key 的总数据量可以放入内存
基本原理及要点:
hash 函数选择,针对字符串、整数等对象有对应的 hash 方法。
碰撞处理,一种是拉链法,一种是开地址法。
扩展:
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 存储在负载小的位置。如果两边一样多,那就存储在 T1 中。
问题实例:
1)对于海量日志数据,提取出某日访问百度次数最多的那个 IP。
由于 IP 的数目是有限的,最多 2^32 ,所以可以考虑使用 hash 将 IP 直接存入内存中的 hash 表,然后进行统计。
1.3 bit-map
适用范围:可以进行数据的快速查找、判重、删除,一般来说数据范围是 int 的10倍以下
基本原理及要点:使用 bit 数组来表示某些元素是否存在,比如8位电话号码。
扩展:bloom filter 可以看作是 bit-map 的扩展。bit-map 可以用作计数排序。
问题实例:
1)已知某个文件内包含一些电话号码,每个号码为8为数字,统计不同号码的个数。
8位范围是 00000000 ~ 99999999,需要100M个 bit,大概只需要十几 MB 的内存即可。
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
将 bit-map 扩展一下,用 2 bit 表示一个数即可,00表示未出现,01表示出现一次,10表示出现2次及以上。
1.4 堆
适用范围:海量数据找 top n,并且 n 比较小,堆可以放入内存
基本原理及要点:最大堆求前 n 小,最小堆求前 n 大。
扩展:双堆,一个最大堆和一个最小堆结合,可以用来维护中位数。
问题实例:
1)100w个数找最大的前100个数
用一个大小为100的最小堆即可。
1.5 双层桶划分
本质上就是 分而治之 的思想,重在分的技巧上。
适用范围:第 k 大,中位数,不重复或重复的数字
基本原理及要点:面对一堆大量的数据我们无法处理的时候,我们可以将其分成一个个小的单元,然后根据一定的策略来处理这些小单元,从而达到目的。双层只是一个例子。
问题实例:
1)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数
整数的个数是2^32,所以我们可以将这2^32个数划分为2^8个区域(同样的数在同一个区域),然后再将数据分到对应的区域中,然后在不同的区域利用 bit-map 就可以解决了。当然这题也可以直接用 bit-map。
2)5亿个 int 找它们的中位数
首先将 int 划分为 2^16 个区域,将数据分到对应的区域中,然后统计落到各个区域里的数据个数,之后我们根据统计结果就可以判断中位数落到哪个区域,同时知道这个区域中的第几大数刚好是中位数。接着第二次扫描,我们只统计落在这个区域中的那些数就可以了。
1.6 数据库索引
适用范围:大数据量的增删改查
基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。
1.7 倒排索引(Inverted Index)
适用范围:搜索引擎,关键字查询
基本原理及要点:建立关键词到文件 ID 的映射,每个关键词都对应着一系列文件,这些文件中都出现这个关键词,从而可以根据关键词去找文档。
问题实例:
文档检索系统、查询哪些文件包含了某单词,比如常见的学术论文的关键词搜索。
1.8 外排序
适用范围:大数据的排序、去重
基本原理及要点:外排序的归并方法,置换选择败者树原理,最优归并树
问题实例:
1)有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。
词的大小为16B,内存只有1M,且要求的是 频数最高。bit-map 通常用于查找和判重,堆通常用于 top k(最大或最小),因此本题只能适用外排序,将内存当做缓冲区使用。
1.9 trie 树(前缀树、字典树)
概念:例如有and,as,at,cn,com这些关键词,可以构造下面的 trie 树:
适用范围:数据量大,但是重复多,数据种类小,可以放入内存。常用于字符串检索、字符串排序、词频统计。
基本原理及要点:实现方式,节点孩子的表示方式
问题实例:
1)有10个文件,每个文件1G,每个文件的每一行都存放的是用户的 query,每个文件的 query 都可能重复。要你按照 query 的频度排序。
词频统计,修改 trie 树的节点结构,使其记录每个 query 的出现频度。
2)1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?
遍历所有字符串,每次在将字符串插入到 trie 树之前,判断能否在 trie 中匹配到重复字符串,如果出现重复,则不插入,否则插入 trie 树。
3)寻找热门查询:查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。
词频统计,修改 trie 树的节点结构,使其记录每个字符串的出现频度。
1.10 分布式处理 MapReduce
适用范围:数据量大,但是数据种类小,可以放入内存
基本原理及要点:将数据交给不同的机器去处理,汇总最后的结果
问题实例:
1)海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
2)一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数的中数(median)?