1. 程式人生 > >給定a、b兩個文件,各存放50億個url,每個url各占用64字節,內存限制是4G,如何找出a、b文件共同的url?

給定a、b兩個文件,各存放50億個url,每個url各占用64字節,內存限制是4G,如何找出a、b文件共同的url?

.... 不同的 來看 相同 兩個文件 oom 兩個 存在 明顯

題目描述:給定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中同時存在,保存下來即可。

給定a、b兩個文件,各存放50億個url,每個url各占用64字節,內存限制是4G,如何找出a、b文件共同的url?