海量數據處理

TOP N問題

  1. 如何在海量數據中找出重複最多一個。數組

  • 經過hash映射爲小文件分佈式

  • 經過hash_map統計各個小文件重讀最多的並記錄次數url

  • 對每一個小文件重複最多的進行創建大根堆spa

  1. 上億有重數據,統計最多前N個。日誌

  • 內存存不下排序

    • 經過hash映射爲小文件內存

    • 經過hash_map統計各個小文件重讀最多的並記錄次數字符串

    • 對每一個小文件重複最多的進行創建大根堆並重復N次取走堆頂並重建堆操做hash

  • 內存存得下it

    • 直接內存經過hash_map統計並建大根堆

    • 重複N次取走堆頂並重建堆操做

  1. 海量日誌數據,提取出某日訪問百度次數最多的那個IP(同1)。

  • 將IP % 1000映射到1000個小文件中

    • 相同IP會被映射到同一個文件

    • 不會出現累加和更大狀況

  • 分1000次在內存處理小文件,獲得頻率最大IP(使用map統計)

  • 對這1000個IP創建大根堆

  1. 1000w查詢串統計最熱門10個(同2)。

  • 同上

  1. 1G的文件,裏面1行1個不超過16字節的詞。內存限制1M,返回頻數最高前100(同2)。

  • 將單詞 % 5000存入5000小文件

    • 平均各文件約200K

    • 對超過1M的文件繼續分割直到小於200K

  • 使用map統計各個詞出現的頻率

  • 對5000詞使用堆排序或歸併排序

分佈式TOP N問題

  1. 分佈在100臺電腦的海量數據,統計前十。

  • 各數據只出如今一臺機器中

    • 先在獨立機器獲得前十

      • 若能夠放入內存直接堆排序

      • 若不可全放入內存:哈希分塊 -> map統計 -> 歸總堆排

    • 再將100臺計算機的TOP10組合起來堆排序

  • 同一元素可同時出如今不一樣機器中

    • 遍歷全部數據,從新hash取模,使同一個元素只出如今單獨的一臺電腦中,而後採用上面方法先統計每臺電腦TOP10再彙總起來

快速外排序問題

  1. 有10個1G文件,每行都是一個可重複用戶query,按query頻度排序。

  • 順序讀取十個文件並採起哈希,將query寫入10個文件中

  • 經過hash_map(query, count)統計每一個query出現次數,至少2G內存

  • 經過獲得的hash_map中query和query_count,對query_count排序並將從新輸出到文件中,獲得已排序好的文件

  • 對十個文件進行歸併排序(外排序)

公共數據問題

  1. A,B兩個文件各存放50億url,每一個爲64Byte,限制內存4G找出公共url。

  • 對A和B兩個大文件,先經過url % 1000將數據映射到1000個文件中,單個文件大小約320M(咱們只須要檢查對應小文件A1 V B1......,不對應小文件不會有相同url)

  • 經過hash_set統計,把A1的url存儲到hash_set中,再遍歷對應的B1小文件,檢查是否在hash_set中,若存在則寫入外存。重複循環處理對應的1000個對。

  1. 1000w有重字符串,對字符串去重。

  • 先hash分爲多個文件

  • 逐個文件檢查並插入set中

  • 多個set取交集

內存內TOP N問題

  1. 100w個數字找出最大100個。

  • 堆排序法

    • 建大根堆,取走堆頂並重建堆,重複100次

  • 快排法

    • 使用快速排序劃分,若某次樞紐元在後10000時(具體狀況具體分析),對後10000數據排序後取前100

位圖法

  1. 在2.5億數字中找出不重複的整數。

  • 使用2-Bit位圖法,00表示不存在,01表示出現一次,10表示出現屢次,11無心義。這樣只須要1G內存。

  • 或者hash劃分小文件,小文件使用hash_set檢查各個元素,獲得的。

  1. 如何在40億數字中快速判斷是否有某個數?

  • 位圖法標記某個數字是否存在,check標記數組。

相關文章
相關標籤/搜索