给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
2016-04-11 12:51
357 查看
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。
s 遍历文件a,对每个url求取
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/ab53f05a04d478cb4beb77d9ab479c20.png)
,然后根据所取得的值将url分别存储到1000个小文件(记为
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/5a5dc1aec7f4742e541334fb87311cfa.png)
)中。这样每个小文件的大约为300M。
s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/6b6df02767e9cb231470c6f6b3ed8677.png)
)。这样处理后,所有可能相同的url都在对应的小文件(
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/4b62773da34696bed130f49b846ea0d6.png)
)中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。
s 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。
方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。
方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。
s 遍历文件a,对每个url求取
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/ab53f05a04d478cb4beb77d9ab479c20.png)
,然后根据所取得的值将url分别存储到1000个小文件(记为
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/5a5dc1aec7f4742e541334fb87311cfa.png)
)中。这样每个小文件的大约为300M。
s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/6b6df02767e9cb231470c6f6b3ed8677.png)
)。这样处理后,所有可能相同的url都在对应的小文件(
![](https://oscdn.geek-share.com/Uploads/Images/Content/201604/4b62773da34696bed130f49b846ea0d6.png)
)中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。
s 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。
方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。
相关文章推荐
- Redis和Memcache对比及选择
- Android高效加载大图、多图解决方案,有效避免程序OOM
- Sudoku---hdu2676(数独DFS)
- LeetCode 191 -Number of 1 Bits ( JAVA )
- 阿里Android一面(校招)
- 安卓001常识
- Markdown应用
- shader三种变量类型(uniform,attribute和varying)
- 特征提取恶作剧Feature Learning Escapades
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- WPF下YUV播放的D3D解决方案
- 五子棋
- SVN使用教程总结
- YTUOJ之删除相同元素(线性表)
- Android自定义实现微信标题栏
- IE6-8中Date不支持toISOString方法
- 从ImageNet数据集上的卷积神经网络可以学到什么What I learned from competing against a ConvNet on ImageNet
- VIM mark功能
- Objective-C的对象模型和runtime机制
- 一个基于RSA算法的Java数字签名例子