海量数据处理:两个大文件中的相同记录
1.題目描述
給定a、b兩個文件,各存放50億個url,每個url各占64字節,內存限制是4G,讓你找出a、b文件共同的url?
2.思考過程
(1)首先我們最常想到的方法是讀取文件a,建立哈希表(為什么要建立hash表?因為方便后面的查找),然后再讀取文件b,遍歷文件b中每個url,對于每個遍歷,我們都執行查找hash表的操作,若hash表中搜索到了,則說明兩文件共有,存入一個集合。
(2)但上述方法有一個明顯問題,加載一個文件的數據需要50億*64bytes = 320G遠遠大于4G內存,何況我們還需要分配哈希表數據結構所使用的空間,所以不可能一次性把文件中所有數據構建一個整體的hash表。
(3)針對上述問題,我們分治算法的思想。
step1:遍歷文件a,對每個url求取hash(url)%1000,然后根據所取得的值將url分別存儲到1000個小文件(記為a0,a1,...,a999,每個小文件約300M),為什么是1000?主要根據內存大小和要分治的文件大小來計算,我們就大致可以把320G大小分為1000份,每份大約300M(當然,到底能不能分布盡量均勻,得看hash函數的設計)
step2:遍歷文件b,采取和a相同的方式將url分別存儲到1000個小文件(記為b0,b1,...,b999)(為什么要這樣做? 文件a的hash映射和文件b的hash映射函數要保持一致,這樣的話相同的url就會保存在對應的小文件中,比如,如果a中有一個url記錄data1被hash到了a99文件中,那么如果b中也有相同url,則一定被hash到了b99中)
所以現在問題轉換成了:找出1000對小文件中每一對相同的url(不對應的小文件不可能有相同的url)
step3:因為每個hash大約300M,所以我們再可以采用(1)中的想法
所以海量數據面前要多采用分治算法,化整為零 各個擊破!
?
總結
以上是生活随笔為你收集整理的海量数据处理:两个大文件中的相同记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络:DNS
- 下一篇: Java集合:Collection和Ma