資料分析之海量資料處理

2021-10-08 13:23:13 字數 2705 閱讀 9865

bitmap

桶注意:1gb = (210)

3=230

2^)^3 = 2^

210)3=

230 = 1073741824b ~= 11億b

1.有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m,要求:返回頻數最高的100個詞。

(1)分而治之/hash對映:順序讀檔案中對於每個詞x取hash(x)%5000,然後按照該值存到5000個小檔案(記為x0,x1,…x4999)中。這樣每個檔案大概是200k左右。如果其中的有的檔案超過了1m大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1m。

(2)hash統計:對每個小檔案,採用trie樹/hash_map等統計每個檔案**現的詞以及相應的頻率。

(3)堆/歸併排序:取出出現頻率最大的100個詞(可以用含100個結點的最小堆),並把100個詞及相應的頻率存入檔案,這樣又得到了5000個檔案。最後就是把這5000個檔案進行歸併(類似於歸併排序)的過程了。

(1)由於ip是32位的,最多有個2^32個ip,約4gb;

(2)可以採用對映的方法,比如模1000,把整個日誌大檔案對映為1000個小檔案;

(3)再找出每個小文**現頻率最大的ip(可以採用hash_map進行頻率統計,然後再找出頻率最大的幾個)及相應的頻率。

(4)然後再在這1000個最大的ip中,找出那個頻率最大的ip。

3.搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。假設目前有一千萬個檢索記錄,但除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢熱度越高,請統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。

事實上只有300萬的query,每個query255b,檔案最大是7.65億b < 1gb。因此我們可以考慮把他們都放進記憶體中去,而現在只是需要乙個合適的資料結構,在這裡,hash table絕對是我們優先的選擇。所以我們摒棄分而治之/hash對映的方法,直接上hash統計,然後排序。

4.給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a、b檔案共同的url?

可以估計每個檔案的大小為5g×64=320g,遠遠大於記憶體限制的4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。

(1)將a、b均按照相同的hash方法分散到1000個小檔案中:a1-a1000、b1-b1000;

(2)a1和b1比較,去重相同的url;

(3)依次類推,將所有相同url合併;

所謂bitmap就是用乙個bit位來標記某個元素所對應的value,而key即是該元素,由於bitmap使用了bit位來儲存資料,因此可以大大節省儲存空間。

用乙個簡單例子來介紹bitmap演算法原理。假設要對0-7內的5個元素[4,7,2,5,3]進行排序(元素沒有重複)。我們可以使用bitmap演算法達到排序目的。要表示8個數,我們需要8個bit。

1.在2.5億個整數中找出不重複的整數,記憶體不足以容納這2.5億個整數。

採用2-bitmap(每個數分配2bit,00表示不存在,01表示出現一次,10表示多次,11無意義)進行,共需記憶體2^32 * 2 bit = 8gb記憶體。然後掃瞄這2.5億個整數,檢視bitmap中相對應位,如果是00變01,01變10,10保持不變。掃瞄完後,檢視bitmap,把對應位是01的整數輸出即可。

2.給40億個不重複的int型整數(32位),亂序,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中?

用bitmap的方法,申請4gb的記憶體,乙個bit位代表乙個int值。遍歷40億個數,設定相應的bit位為1。讀入要查詢的數,檢視相應bit位是否為1,為1表示存在,為0表示不存在。

多層桶劃分,本質思想還是分而治之,可以認為是bitmap的增強版。

基本原理:因為元素範圍很大,記憶體超限,不能使用直接定址表,所以通過多次劃分,逐步確定範圍,每次都在乙個可以接受的範圍內進行,逐步縮小。

使用場景:bitmap所需要的記憶體空間無法一次性滿足。

常見問題:第k大數,中位數,不重複或重複的數字

找出5億個int的中位數。

(1) 如果資料型別為int16,首先申請一塊2

162^

216個bit的記憶體區域,然後將5億個數依次劃分到這些區域中,依次統計落到各個區域裡的數的個數,之後我們根據計算出中間位置的數應該落到那個區域,同時知道這個區域的第幾個數剛好是中位數;然後第二次掃瞄我們只統計落在這個區域中的那些數就可以了。

(2) 實際上,如果不是int16而是int64,2

642^

264個bit在記憶體中是存不下的,但可以經過3次劃分降低到可以計算的程度。即可以先將2

642^

264個區域分為2

242^

224個較大的區域,然後確定區域的中部位於哪個區域內,再將該區域分成2

202^

220個子區域,然後確定區域的中部位於哪個區域內,然後每個子區域裡的數的個數只有2

202^

220,就可以直接利用直接定址表進行統計了。

海量資料處理分析

筆者在實際工作中,有幸接觸到海量的資料處理問題,對其進行處理是一項艱鉅而複雜的任務。原因有以下幾個方面 一 資料量過大,資料中什麼情況都可能存在。如果說有10條資料,那麼大不了每條去逐一檢查,人為處理,如果有上百條資料,也可以考慮,如果資料上到千萬級別,甚至過億,那不是手工能解決的了,必須通過工具或...

海量資料處理分析

筆者在實際工作中,有幸接觸到海量的資料處理問題,對其進行處理是一項艱鉅而複雜的任務。原因有以下幾個方面 一 資料量過大,資料中什麼情況都可能存在。如果說有10條資料,那麼大不了每條去逐一檢查,人為處理,如果有上百條資料,也可以考慮,如果資料上到千萬級別,甚至過億,那不是手工能解決的了,必須通過工具或...

海量資料處理分析

海量資料處理分析 北京邁思奇科技 戴子良 筆者在實際工作中,有幸接觸到海量的資料處理問題,對其進行處理是一項艱鉅而複雜的任務。原因有以下幾個方面 一 資料量過大,資料中什麼情況都可能存在。如果說有10條資料,那麼大不了每條去逐一檢查,人為處理,如果有上百條資料,也可以考慮,如果資料上到千萬級別,甚至...