给定ab两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出ab文件共同的url?

Posted Vanguard

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定ab两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出ab文件共同的url?相关的知识,希望对你有一定的参考价值。

题目描述:给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?

 

分析:我们先来看如果要把这些URL全部加载到内存中,需要多大的空间。

1MB = 2^20 = 10^6 = 100W

1GB = 2^30 = 10^9 = 10亿

50亿 = 5G * 64 Byte = 320G

明显是不可能全部加载到内存中的。我们可采用以下方法解决:

方法1:

采用Bloom filter,假设布隆过滤器的错误率为0.01,则位数组大小m约为输入元素个数n的13倍,此时需要的哈希函数k约为8个。

 

元素个数:n = 5G
位数组大小:m = 5G * 13 = 65G = 650亿 即需要650亿个bit位才能达到错误率0.01
而我们拥有的内存可容纳bit位个数:4G * 8bit = 32G bit = 320亿,按此实现错误率大于0.01。

方法2:

 

分别扫描A,B两个文件,根据hash(url)%k(k为正整数,比如k = 1000,那么每个小文件只占用300M,内存完全可以放得下)将url划分到不同的k个文件中,比如a0,a1,....a999;b0,b1,...b999;

这样处理后相同的url肯定在对应的小文件中(a0 vs b0,a1 vs b1,...a999 vs b999)因为相同的url%1000的值肯定相同,不对应的小文件不可能有相同的url;

然后我们只要求出1000对小文件中相同的url即可。比如对于a0 vs b0,我们可以遍历a0,将其中的url存放到hash_map中,然后遍历b0,如果b0中的某个url在hash_map中,则说明此url在a和b中同时存在,保存下来即可。

以上是关于给定ab两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出ab文件共同的url?的主要内容,如果未能解决你的问题,请参考以下文章

面试- 阿里-. 大数据题目- 给定ab两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出ab文件共同的url?

面试常用算法

两个大文件中找出共同记录

JAVA大数据处理题

海量数据与布隆过滤

西安尚学堂练习09.10|Java编程笔试面试题