1. 程式人生 > >海量資料處理方法及應用

海量資料處理方法及應用

一、雜湊切割top K問題

1. 給一個超過100G大小的log file, log中存著IP地址, 設計演算法找到出現次數最多的IP地址?

(1)首先使用雜湊函式HashFunc(ip)將每一個IP地址轉化為整型,再通過HashFunc(ip)%1000使得每一個IP各自進入到所切分的1000個小檔案中,餘數是多少就對映到多少號檔案中,這樣做能保證相同IP進入到同一檔案中;
(2)接著在每一個小檔案中建立Key-Value模型的雜湊表,各自統計出Value(出現次數)最大的IP;
(3)最後依次比較這1000個小檔案中出現次數最多的IP,找到最終出現次數最多的IP地址。

2. 與上題條件相同,如何找到top K的IP?

     先對第一個小檔案的資料建立小堆(大小為K),存入出現次數最多的前K個IP,再依次讀入每一個檔案,將每一個IP的出現次數與堆中IP次數比較,如果大於堆頂的IP,則替換堆頂,並更新堆,依次執行下去,直到1000個檔案全部讀完,整個堆的資料即為出現次數最多的前K個IP。

二、點陣圖應用

1. 給定100億個整數,設計演算法找到只出現一次的整數

     所有整數的範圍是從0到42億9千萬,每個整型佔用4位元組,這樣存放這些整數至少需要16G的記憶體空間,太耗費空間了,如果用點陣圖的思想來解決這個問題,就可以大幅度節省空間。
     在該題中需要注意的是要統計次數,而原本的點陣圖用1個bit位只能表示一個數是否存在,所以要將原本的點陣圖進行一次變形,用2個bit位表示一個數(00表示沒有出現,01表示出現一次,10或11表示出現多次),最後統計每兩位為01的資料即為只出現一次的整數,此時存放這些整數佔用空間大小約為1G。

2. 給兩個檔案,分別有100億個整數,我們只有1G記憶體,如何找到兩個檔案交集

     將每個檔案中的資料都對映到一個位圖中去,每個檔案的資料大約佔用500M的記憶體空間,剛好滿足要求,之後讓兩個點陣圖進行位操作與(&)得到一個新的點陣圖,在新的點陣圖中統計所有bit位為1的資料即為兩個檔案的交集。

3. 1個檔案有100億個int,1G記憶體,設計演算法找到出現次數不超過2次的所有整數

     這個問題和第一個問題類似,同樣利用點陣圖的思想,用2個bit位表示一個數(00表示沒有出現,01表示出現一次,10表示出現兩次,11表示出現多次),最後統計每兩位為01或10的資料即為出現次數不超過2次的整數,此時存放這些整數佔用空間大小約為1G。

三、布隆過濾器+雜湊切分

1. 給兩個檔案,分別有100億個query,我們只有1G記憶體,如何找到兩個檔案交集?分別給出精確演算法和近似演算法

(1)精確演算法:利用雜湊切分
這裡寫圖片描述
     假設每個query佔用位元組大小為50,那麼每個檔案就需要大約500G的記憶體空間,這顯然滿足不了,這時我們就需要利用雜湊切分將每個檔案切分成1000份小檔案,那麼每個小檔案的佔用空間就只有500M左右。
     兩個檔案分別使用相同的雜湊函式HashFunc(query)將每一個query轉化為整型,再通過HashFunc(ip)%1000使得各自的每一個query進入到所切分的1000個小檔案中,餘數是多少就對映到多少號小檔案中,這樣做能保證相同query進入到同一檔案中,最後再依次比較編號相同的小檔案就可以找到兩個檔案的交集。
(2)近似演算法:利用布隆過濾器
     將其中一個檔案的內容利用布隆過濾器對映到一個位圖中,再用另一個檔案的內容依次在該點陣圖上查詢,若存在則為兩個檔案的交集(這種演算法可能會出現誤判的問題)

2. 如何擴充套件BloomFilter使得它支援刪除元素的操作

     對於布隆過濾器來說,當我們要刪除某一個關鍵字時,該關鍵字對應的位可能會牽動到其他的關鍵字,所以一個簡單的改進就是將位陣列中的每一位擴充套件為一個counter,從而支援了元素的刪除操作。要注意的一點是:當計數減到0時,就保持0不變,表示該地址處沒有對映。

3.如何擴充套件BloomFilter使得它支援計數操作

     要使BloomFilter支援技術操作,每一位至少是一個int型別,一旦位擴充套件成了counter,每一個counter就不僅能表示這一地址有無對映,還能表示對映的個數。

四、倒排索引

給上千個檔案,每個檔案大小為1K—100M。給n個詞,設計演算法對每個詞找到所有包含它的檔案,只有100K記憶體

這裡寫圖片描述
(1)首先對於每一個檔案,建立一個布隆過濾器,以方便查詢所給的n的關鍵詞;
(2)接著建立一個雜湊桶(順序表+連結串列),順序表裡依次存放每一個關鍵詞,每一個關鍵詞所對應的連結串列裡存放有該關鍵詞出現的檔案的地址(也可以加上在某一個檔案中出現的次數);
(3)最後統計出每一個關鍵詞所對應的連結串列裡的檔案地址,即可找到所有包含它的檔案。