海量資料處理

龍躍十二發表於2018-03-08

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

思路:首先100G大小的檔案,計算機記憶體無法儲存,所以我們解決問題首先不能考慮把檔案放在記憶體中在去遍歷統計次數。但是我們可以資料結構中的雜湊表來處理。
1)切割檔案:將100G的大檔案檔案分割為1000份(分多少份取決你處理檔案的大小)。

2)計算ip的位置:ip是字串,我們通過字串雜湊函式可以計算出每個IP對應的index(index = Hashfunc(ip)%1000)。

3)統計ip出現的次數:利用key (ip)—value(ip出現的次數)模型去統計每個ip出現的次數。

4)找出次數最多的ip:遍歷每個小檔案,找出最大的value值,即為出現做多的次數。

圖解過程如下:
雜湊切割

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

思路:整數是4個位元組,100億個整數所佔記憶體大約是40G,所以無法直接對100億個整數進行統計。有個資料結構叫點陣圖(雜湊表的變形),利用他便可以解決這個問題。
當然這裡必須對點陣圖進行處理,如果對映到該位置為0,則將該位置置1,如果對映到該位置為1,則置0。最後位元位為1的數,即為出現一次的數。
當然此題也可以用雜湊表解決,思路與上題相同。

點陣圖節省空間,雜湊表則會花費大量空間。

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

思路:這道題也是不能直接操作,必須藉助點陣圖來處理。(100億整數估算要花費40G,題目給出的記憶體是1G)。
利用點陣圖可以只需要開闢整數的最大範圍個位元位(大約是500M)。

1)將一個檔案中所有整數對映到點陣圖。

2)遍歷第二個檔案再次對映到點陣圖,如果對映位置為1則置0,對映位置為0則置1,最後取反。取反後為1的位置既是兩個檔案交際。

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

思路:同樣利用點陣圖,這裡要對點陣圖做處理,用兩個點陣圖進行計數,00出現0次,01出現一次,10出現兩次,大於兩次用11記錄。
1)對映所有整數到點陣圖。

2)遍歷點陣圖,出現01則為需要找的整數。

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

思路:假設每個query為10個位元組,100億個query則為100 * 10 個位元組。估算需要100G記憶體,兩個檔案需要200G記憶體,題目只有1G記憶體。
近似演算法用布隆過濾器,步驟與上題求交集方法一樣。
精確演算法:
估算:100億個位元組大約需要10G的記憶體,假設每個query所佔10個Bite,100億個query就需要100G的記憶體,顯然計算機是存不下的
這裡找交集,我們可以考慮使用雜湊分割,具體做法如下:
1)將兩個檔案分別分成1000份的小檔案,將問題轉化為求這兩個小檔案劃分出來的每個小檔案的交集
2)將每個小檔案的交集求出,整合成兩個檔案的交集

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

基本的布隆過濾器不支援刪除(Deletion)操作,但是 Counting filters 提供了一種可以不用重新構建布隆過濾器但卻支援元素刪除操作的方法。在Counting filters中原來的位陣列中的每一位由 bit 擴充套件為 n-bit 計數器,實際上,基本的布隆過濾器可以看作是隻有一位的計數器的Counting filters。原來的插入操作也被擴充套件為把 n-bit 的位計數器加1,查詢操作即檢查位陣列非零即可,而刪除操作定義為把位陣列的相應位減1,但是該方法也有位的算術溢位問題,即某一位在多次刪除操作後可能變成負值,所以位陣列大小 m 需要充分大。另外一個問題是Counting filters不具備伸縮性,由於Counting filters不能擴充套件,所以需要儲存的最大的元素個數需要提前知道。否則一旦插入的元素個數超過了位陣列的容量,false positive的發生概率將會急劇增加。當然也有人提出了一種基於 D-left Hash 方法實現支援刪除操作的布隆過濾器,同時空間效率也比Counting filters高。

相關文章