【海量數據處理】如何從大量數據中找出高頻詞?

如何從大量數據中找出高頻詞?

題目描述

有一個 1GB 大小的文件,文件裏每一行是一個詞,每個詞的大小不超過 16B,內存大小限制是 1MB,要求返回頻數最高的 100 個詞(Top 100)。

解答思路

由於內存限制,我們依然無法直接將大文件的所有詞一次讀到內存中。因此,同樣可以採用分治策略,把一個大文件分解成多個小文件,保證每個文件的大小小於 1MB,進而直接將單個小文件讀取到內存中進行處理。

思路如下

首先遍歷大文件,對遍歷到的每個詞x,執行 hash(x) % 5000,將結果爲 i 的詞存放到文件 ai 中。遍歷結束後,我們可以得到 5000 個小文件。每個小文件的大小爲 200KB 左右。如果有的小文件大小仍然超過 1MB,則採用同樣的方式繼續進行分解。

接着統計每個小文件中每個詞出現頻數。最簡單的方式是使用 HashMap 來實現。其中 key 爲詞,value 爲該詞出現的頻率。具體方法是:對於遍歷到的詞 x,如果在 map 中不存在,則執行 map.put(x, 1);若存在,則執行 map.put(x, map.get(x)+1),將該詞頻數加 1。

上面我們統計了某個小文件單詞出現的頻數。接下來,我們可以通過維護一個小頂堆來找出所有詞中出現頻數最高的 100 個。具體方法是:構建一個小頂堆,堆大小爲 100。遍歷map,如果遍歷到的詞的出現次數大於堆頂詞的出現次數,則用新詞替換堆頂的詞,然後重新調整爲小頂堆,當所有小文件對應的頻數map遍歷結束後,小頂堆上的詞就是出現頻數最高的 100 個詞。

方法總結

  1. 分而治之,進行哈希取餘;
  2. 使用 HashMap 統計頻數;
  3. 求解最大的 TopN 個,用小頂堆;求解最小的 TopN 個,用大頂堆
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章