天天看點

海量資料處理常用思想及重要資料結構

1、大頂堆、小頂堆

海量資料處理常用思想及重要資料結構

特别适合topN問題,如求海量日志中最大的100個數。既然是海量資料,那麼記憶體中一下子無法加載所有的資料集,此時可以先讀取海量資料中的100個數,建立資料集為100的小頂堆(小頂堆的對頂比所有元素都小),然後依次往堆結構中讀取數字,調整堆,使其保持小頂堆,最後得到top100的最大數。

2、hash映射進行分治,然後歸并

hash映射按照資料特征把海量資料變的不海量,然後分别處理各段資料,再歸并處理。例如:給定兩個檔案,各存放50億個url,讓你找出兩個檔案中共同的url,則可以根據url的特征,将兩個檔案分别映射到上千個小檔案中,隻要保證兩個檔案用的相同的hash映射方法,那麼相同的url映射後一定在相同的小檔案中,是以逐一比較各個小檔案中的url,然後歸并即可。

3、hash統計

以特征為key值利用hash表進行統計,比如,求一本書中26個字母出現的個數,可以以26個字母分别為key值,進行hash統計即可。

4、bloom filter

可以用于判重,此方法存在一定的誤差,但是比較高效。方法是利用多種不同的hash方法對資料集做hash運算,将對應的結果為key,值為1,然後判斷一個新數在不在這個資料集中,則用相同的n中hash方法進行計算,如果全為1則認為在,任何一個不為1,則認為不在。

5、外排序

外隻的是外存,因為記憶體一下子放不下海量的資料,是以隻好把大資料拆成小資料,在記憶體中進行排序,在外存中進行存儲。基本思想是先對大資料拆分成n個小資料,然後對小資料排序,然後放入檔案中,再用歸并的方法,将已排序的小資料集進行歸并。

6、bitmap

位圖用一個bit位來标記某個元素所對應的value,而key即是該元素本身,位圖可以節約大量的空間。例如判斷一個32位的整數是否在海量的32位整數資料集中出現過,則可使用位圖。

7、多層劃分

和hash映射類似也是分而治之,隻不過是如果資料集恰好有一些可以分層的特點,則可以直接分層化大為小。如,海量32位整數的資料集中找中位數,首先我們将int劃分為2^16個區域,然後讀取資料統計落到各個區域裡的數的個數,之後我們根據統計結果就可以判斷中位數落到那個區域,同時知道這個區域中的第幾大數剛好是中位數。最後再次掃描我們隻統計落在這個區域中的那些數就可以了。

8、tire樹

比較适合字元串類的查找,如把1000萬個單詞中的大量的重複單詞去掉,可以使用tire樹進行查重。

9、mapreduce

有現成的大資料計算架構。