1. top K問題:在海量數據中找出出現頻率最高的前K個數、或從海量數據中找出最大的前K個數,這類問題統稱爲top K問題。排序
針對top K類問題,一般比較好的方式是分治+hash+小頂堆內存
eg:在1億個浮點數中找出其中最大的10000個。hash
方法一:排序取出前10000個。 每一個float佔4B,1億個浮點數400MB,對於內存小於400MB的該方法不能一次將所有數據讀入內存進行排序,並且排序是對全部元素進行排序,作了不少無用功。it
方法二:局部淘汰法。 用一個容器保存前10000個數,而後將剩餘數字一一與容器中的最小數字比較,若是全部後續的元素都比容器中10000個數還小,那麼容器內的這10000個數就是最大的10000個數。若某一後續元素比容器內的最小元素大,則刪除掉容器內的最小元素,並將該元素插入容器,最後遍歷完這1億個數,獲得結果容器中保存的數即爲最終結果。容器
方法三:分治法。 將1億個數據分紅100份,每份100萬,找出每份數據中最大的10000個,最後在100*10000個數據裏面找出最大的10000個。若是100萬選的足夠理想,那麼能夠濾掉1億數據裏面99%的數據。遍歷
方法四:最小堆。 先讀10000個數據構造大小爲10000的小頂堆,而後遍歷後續的數字,並與堆頂(最小)數字進行比較,若比最小的數字小,則繼續讀取後續數字;若比堆頂數字大,則替換堆頂元素並從新調整堆爲小頂堆。直到1億個數據遍歷完畢。float
若是在求1億個出現次數最多的100個數,MapReduce 直接將數據均分到不一樣的機器上進行處理是沒法獲得正確結果,因爲一個數據可能被分到不一樣的主機上,而另外一個徹底可能狙擊到一個機器上。方法
2. 重複問題:在海量數據中查找重複出現的元素或者去除重複出現的元素。針對此類問題,通常能夠用位圖法實現。 例如:已知某個文件中包含一些電話號碼,每一個號碼爲8位,統計不一樣號碼的個數。統計
解決辦法:8位整數能夠表示的最大十進制數值爲99999999,若是每一個數字對應位圖中的一個爲,那麼存儲八位整數大約須要99Mbit,由於1Byte=8bit,因此99Mbit摺合成內存爲99/8=12.375MB的內存,既可使用12.375的內存表示全部8位數電話號碼的內容。數據
3. 排序法:海量數據排序。 例如:針對一個文件中有9億條不重複的整數,對這個文件中數字進行排序。
方法一:位圖法