前言
这里主要针对案例进行分析讲解,欢迎大家在问题或是直接贡献更多相关的海量数据相关难题。这里我将持续性的更新一些面试中常见的海量数据案例。
这里我将会持续更新,时间有限不能全面总结,欢迎大家一起完善。
海量数据问题处理方法
- 哈希
- 位图
- 布隆过滤器(Bloom Filter)
- 堆(堆)
- 双层桶划分
- 数据库索引
- 倒排索引(倒置索引)
- B +树
- 特里树
- MapReduce的
海量数据案例
1.两个大文件中找出共同记录
题目描述
给定a,b两个文件,各存放50亿个url,每个url不占64字节,内存限制是4G,让你找出a,b文件共同的url?
解题思路
方案1
首先我们最常想到的方法是读取文件a,建立哈希表方便后面查找,然后再读取文件b,遍历文件b中每个url,对于每个遍历,我们都执行查找hash表的操作,若哈哈表中搜索到了,则说明两文件共有,存入一个集合。
可以估计每个文件安的大小为5G×64 = 320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。
针对上述问题,我们分治算法的思想。
-
遍历文件a,对每个url求取
hash(url)%1000
,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,...,a999每个小文件约300M),为什么是1000?主要根据内存大小和要分治的文件大小来计算,我们就大致可以把320G大小分为1000份,每份大约300M(当然,到底能不能分布尽量均匀,得看哈希函数的设计) -
遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为b0,b1,...,b999)
为什么要这样做?文件a的哈希映射和文件b的哈希映射函数要保持一致,这样的话相同的url就会保存在对应的小文件中,比如,如果a中有一个url记录data1被哈希到了a99文件中,那么如果b中也有相同url,则一定被hash到了b99中。
所以现在问题转换成了:找出1000对小文件中每一对相同的url(不对应的小文件不可能有相同的url)
- 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。
方案2
如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿位。将其中一个文件中的url使用Bloom filter映射为这340亿位,然后挨个读取另外一个文件的url,检查是否与Bloom过滤器,如果是,那么该你应该是共同的url(注意会有一定的错误率)。
2.大文件排序和去重
如果有一个500G的超大文件,里面都是数值,如何对这些数值排序? - 优快云博客https://blog.youkuaiyun.com/u011381576/article/details/79385133
大文件的排序和去重超级简单的实现 - zero_learner - 博客园 https://www.cnblogs.com/yangxudong/p/3848453.html