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