海量數據處理有很多種方法,如哈希分治、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))