(1)雜湊
對於雜湊,相信大家都不會陌生。其基本原理不再說明,雜湊的乙個關鍵點是雜湊函式的選擇,如何使對映結果更加均衡及衝突減少。關於雜湊也有許多變種,如一致性雜湊(詳見海量資料處理中,雜湊可用於快速查詢及刪除,通常需要總資料量可以放入記憶體中。
講解:ip最多為2^32個,為4g,一次放入記憶體中不行,可以採用分而治之的方法,先hash(ip)/1024,將ip位址分別對映到1024個小檔案中,每個檔案4m,再將每個小檔案中的ip放入記憶體中,進行hashmap,統計出出現頻率最高的那個ip,最後可以得到1024個出現高頻的ip,採用氣泡排序,可以迅速找出頻率最高的那個ip.
(2)bitmap
bitmap可謂是非常經典的海量資料處理工具,其本質是用bit陣列的某一位表示某一資料,從而乙個bit陣列可以表示海量資料。關於bitmap詳見:
bitmap例項:已知某個檔案內包含一些**號碼,每個號碼為8位數字,統計不同號碼的個數。
講解:8位數字最多為99,999,999,則1億個bit就可以儲存,大約為12.5mb記憶體。依此查詢**號碼,若**號碼對應的位元位為0,則置1,若已經為1,則表明前面已出現該號碼。遍歷檔案完畢後,統計所有位元位為1的位數,即為不同號碼的個數。
(3)布隆過濾器(bloom filter)
關於布隆過濾器,在前面的一篇部落格中已詳細講過,詳見:布隆過濾器的實質是由乙個位陣列及k個雜湊函式組成,將將要對映的元素通過k次雜湊對映到位陣列的相應位置當中。布隆過濾器可以看做是雜湊函式和bitmap的擴充套件,它允許有一定的錯誤。且錯誤率與位陣列的個數m、雜湊函式個數k及要對映的元素個數m有必然的聯絡,當hash函式個數k=(ln2)*(m/n)時錯誤率最小。
布隆過濾器例項:給你a,b兩個檔案,各存放50億條url,每條url占用64位元組,記憶體限制是4g,讓你找出a,b檔案共同的url。
講解:50億條url,大約有5g條,每條占用64b,則共為320g,遠遠超過記憶體的4g。若想把這50億條url全部對映到記憶體中,可以用布隆過濾器處理。4g記憶體大約為320億個bit,將50億條url若按出錯率0.01計算,大約需要650億個bit,現在為320億個bit,也是可以接受的。所以在允許有出錯率的情況下,將50億條url對映到4g記憶體中,再遍歷另乙個檔案,若發現已經在記憶體中對映,則表明該url為共有的。
(4)堆
剛接觸堆這個概念,是在資料結構中的內部排序演算法中,是一種樹形選擇排序。在海量資料儲存中,堆適合解決求取資料中符合條件的某n個數,如出現頻率最大的前n個,堆可以放在記憶體中進行。
堆例項:有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。
講解:由於記憶體只有1m,不能將整個檔案全部放入記憶體中。我們採取分而治之的方法,首先將1g檔案中所有的詞雜湊到2000個檔案中,每個檔案大約為500k,雜湊過程必須保證相同的詞對映到同一檔案中。再在每個小檔案中採用trie樹或hash_map統計出現的次數。最後在維護乙個容量為100的小頂堆即可。
(5)mapreduce
mapreduce是一種分布式處理,將資料劃分到不同的機器上進行處理,最後再對每台機器上的結果進行整合。資料劃分,結果規約。
mapreduce例項:上千萬或億資料,統計其**現次數最多的前n個資料。
講解:首先可以根據資料值或者把資料hash後的值,將資料按照範圍劃分到不同的機子,最好可以讓資料劃分後可以一次讀入記憶體,這樣不同的機子負責處理各種的數值範圍,實際上就是map。得到結果後,各個機子只需拿出各自的出現次數最多的前n個資料,然後彙總,選出所有的資料**現次數最多的前n個資料,這實際上就是reduce過程。
(6)trie樹
trie樹是快速查詢字串的乙個很有用的工具,是一種樹形結構。適用於重複數量比較多的海量資料。詳見:
trie樹例項:1000萬個記錄(這些查詢串的重複度比較高,長度為1-255個位元組,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。
講解:可以建立一棵trie樹(3百萬個字串,大約為765m,小於1g),在關鍵字域儲存其串的出現次數,然後用小頂堆求前10個字串。或者利用hash將1000萬記錄雜湊到300萬的範圍內,統計每個記錄的頻度(用trie或hash_map)。然後用維護乙個大小為10的小頂堆遍歷這300萬的統計結果。
海量資料處理
1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...
海量資料處理
給定a b兩個檔案,各存放50億個url,每個url各占用64位元組,記憶體限制是4g,如何找出a b檔案共同的url?答案 可以估計每個檔案的大小為5g 64 300g,遠大於4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取hash url 1000...
海量資料處理
分而治之 hash對映 hash統計 堆 快速 歸併排序 300萬個查詢字串中統計最熱門的10個查詢。針對此類典型的top k問題,採取的對策往往是 hashmap 堆。hash統計 先對這批海量資料預處理。具體方法是 維護乙個key為query字串,value為該query出現次數的hashtab...