小灰学习大数据主要是针对大数据的面试题和笔试题分析,学习来写的。但愿能让本身有提示,也能帮助别人。废话很少说,上题了。html
首先看到题目开始分析,50亿个url,一个64字节是多大呢?node
咱们先来计算,64/1024=0.0625bit一个url. 0.0625*50亿约等于320G.这么看挺大的,因此不可能将其彻底加载到内存中处理,考虑采起分而治之的方法。好有这个思路,咱们提出如下方案。面试
方案1:将大文件分红可以被内存加载的小文件。算法
前面分析每一个文件的大小为50G×64=320G,远远大于内存限制的4G。因此数组
s 遍历文件a,对每一个url求取 ,而后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每一个小文件的大约为300M。数据结构
s 遍历文件b,采起和a相同的方式将url分别存储到1000各小文件。这样处理后,全部可能相同的url都在对应的小文件中,不对应的小文件不可能有相同的url。而后咱们只要求出1000对小文件中相同的url便可。函数
s 求每对小文件中相同的url时,能够把其中一个小文件的url存储到hash_set中。而后遍历另外一个小文件的每一个url,看其是否在刚才构建的hash_set中,若是是,那么就是共同的url,存到文件里面就能够了。性能
方案2:内存映射成BIT最小存储单元。(网上看的,因此我准备弄懂它)学习
若是容许有必定的错误率,可使用Bloom filter,4G内存大概能够表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,而后挨个读取另一个文件的url,检查是否与Bloom filter,若是是,那么该url应该是共同的url(注意会有必定的错误率)。大数据
首先,咱们来看看什么事Bloom filter?
Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。一般应用在一些须要快速判断某个元素是否属于集合,可是并不严格要求100%正确的场合。
上过数据结构咱们知道,单一哈希函数发生冲突的几率过高。Hash表冲突的各类解决方法,若要下降冲突发生的几率到1%,就要将BitSet的长度设置为URL个数的100倍。因此咱们用Bit-Map方法,创建一个BitSet,将每一个URL通过多个哈希函数映射到某一位。下面来看看具体作法
建立一个m位BitSet,先将全部位初始化为0,而后选择k个不一样的哈希函数。第i个哈希函数对字符串str哈希的结果记为h(i,str),且h(i,str)的范围是0到m-1
图1.Bloom Filter加入字符串过
对于字符串str,分别计算h(1,str),h(2,str)…… h(k,str)。而后检查BitSet的第h(1,str)、h(2,str)…… h(k,str)位是否为1,若其中任何一位不为1则能够断定str必定没有被记录过。若所有位都是1,则“认为”字符串str存在; 若一个字符串对应的Bit不全为1,则能够确定该字符串必定没有被Bloom Filter记录过。(这是显然的,由于字符串被记录过,其对应的二进制位确定所有被设为1了)
可是若一个字符串对应的Bit全为1,其实是不能100%的确定该字符串被Bloom Filter记录过的。(由于有可能该字符串的全部位都恰好是被其余字符串所对应)这种将该字符串划分错的状况,称为false positive 。
(1)哈希函数选择
哈希函数的选择对性能的影响应该是很大的,一个好的哈希函数要能近似等几率的将字符串映射到各个Bit。选择k个不一样的哈希函数比较麻烦,一种简单的方法是选择一个哈希函数,而后送入k个不一样的参数。
(2)Bit数组大小选择
哈希函数个数k、位数组大小m、加入的字符串数量n的关系能够参考文献1。该文献证实了对于给定的m、n,当 k = ln(2)* m/n 时出错的几率是最小的。
参考文献1:http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html