舉例
有一個1G大小的一個檔案,裡面每一行是一個詞,詞的大小不超過16位元組,記憶體限制大小是1M。返回頻數最高的100個詞。
思路
- 首先把檔案分開
- 針對每個檔案hash遍歷,統計每個詞語的頻率
- 使用堆進行遍歷
- 把堆歸併起來
具體的方案
1.分治: 順序讀檔案中,對於每個詞c,取hash(c)%2000,然後按照該值存到2000個小檔案中。這樣每個檔案大概是500k左右。
注意:
如果其中的有的檔案超過了1M大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1M。
2.hash遍歷: 對每個小檔案,用hash的方式統計每個檔案中出現的詞以及相應的頻率
3.堆遍歷: 用 最小堆取出出現頻率最大的100個詞,並把100個詞及相應的頻率存入檔案,這樣又得到了5000個檔案。
4.歸併整合
下一步就是把這5000個檔案進行歸併(類似與歸併排序)的過程了。