海量數據處理(一)哈希分治

    海量數據處理有很多種方法,如哈希分治、simhash、外排序、多層劃分等。本文將討論哈希分治

 

    哈希分治的核心是hash_map,hash_map和map類似,不過hash_map能夠創造出對象而map不能。對內存中查找數據,hash_map比較適合在內存中查找。當然,這不是重點。

 

    一個很典型的題:如果有兩個500G的文件,裏面放着若干IP地址,要求查找出出現頻率TOP10,而給定內存爲1G。該怎麼處理。

 

很明顯,我們不可能將文件加載到內存裏。所以,對於這種海量數據處理,我們需要使用hash_map類的查找方法。

第一步:哈希映射。

    分而治之的思想,兩個500G的文件合起來是1000G,給的內存爲1G,那麼我就創建1000個小文件,通過哈希函數hash(x)00,將兩個大文件裏的數據全部分到這1000個小文件裏,如果hash函數不夠好造成衝突,導致某個文件超過了1G,那麼我們可以用線性探測法的思路往下分,直到每個所獲得的文件大小都不超過1M。

第二部:hash_map統計

    對每個小文件,使用hash_map或者T樹等方法統計每個文件中出現的IP地址以及頻率,對頻率排序,寫入一個新的小文件裏。並刪除原先的小文件。這樣將產生新的1000個小文件並刪除舊的1000個小文件。

第三步:對新的1000個小文件進行排序,並將TOP10寫入一個新的文件裏,並刪除舊的1000個小文件。

 

 

難度降低,如果給100W個數,或1000W(能夠加載到內存),要求TOP10。

方法1:堆排序,創立含100個元素的最小堆(時間複雜O(n*logn))

方法2:插排,選前10個數並排序,之後插排,直到遍歷所有元素(時間複雜O(n*10))

海量數據處理有很多種方法,如哈希分治、simhash、外排序、多層劃分等。本文將討論哈希分治

    哈希分治的核心是hash_map,hash_map和map類似,不過hash_map能夠創造出對象而map不能。對內存中查找數據,hash_map比較適合在內存中查找。當然,這不是重點。

一個很典型的題:如果有兩個500G的文件,裏面放着若干IP地址,要求查找出出現頻率TOP10,而給定內存爲1G。該怎麼處理。

    很明顯,我們不可能將文件加載到內存裏。所以,對於這種海量數據處理,我們需要使用hash_map類的查找方法。
    第一步:哈希映射。
    分而治之的思想,兩個500G的文件合起來是1000G,給的內存爲1G,那麼我就創建1000個小文件,通過哈希函數hash(x)00,將兩個大文件裏的數據全部分到這1000個小文件裏,如果hash函數不夠好造成衝突,導致某個文件超過了1G,那麼我們可以用線性探測法的思路往下分,直到每個所獲得的文件大小都不超過1M。
    第二部:hash_map統計
    對每個小文件,使用hash_map或者T樹等方法統計每個文件中出現的IP地址以及頻率,對頻率排序,寫入一個新的小文件裏。並刪除原先的小文件。這樣將產生新的1000個小文件並刪除舊的1000個小文件。
    第三步:對新的1000個小文件進行排序,並將TOP10寫入一個新的文件裏,並刪除舊的1000個小文件。


難度降低,如果給100W個數,或1000W(能夠加載到內存),要求TOP10。
方法1:堆排序,創立含100個元素的最小堆(時間複雜O(n*logn))
方法2:插排,選前10個數並排序,之後插排,直到遍歷所有元素(時間複雜O(n*10))

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章