海量資料處理問題

2021-08-16 01:38:25 字數 1895 閱讀 9672

一、給乙個超過100g大小的log file, log中存著ip位址, 設計演算法找到出現次數最多的ip位址?

該題目要求的是出現次數最多的乙個,有時候題目也會變成求出現次數排名前k的ip位址,兩個問題的解題思路是一致的,只是求前k個會多乙個小步驟,就是建堆,所以現在學習一下,求前k個的思路。100g記憶體的檔案顯然是不能拿到記憶體中取得,那麼我們處理這個問題的思路就是將這個檔案分成很多個小檔案,然後在用每個小檔案在進行比較就容易得多。

具體思路如下:

①我們先去把logfile檔案分成1000分,每乙個可以當作乙個小檔案

②接著我們根據雜湊字串處理的相關函式,求的每乙個ip位址的key值,用這個key值,去mod1000,那麼我們此時就能知道該ip在1000個小檔案中應該存在第幾個小檔案中

③此時如果是找出現次數最多的乙個,就挑出1000個小檔案中,每乙個小檔案中出現最多的一次,然後在這1000個數中找到最大的乙個,但是如果要求前k個,此時我們根據第乙個小檔案建立乙個儲存k個資料的小堆,在和之後的小檔案一次進行比較,那麼最後我們這個小堆裡面儲存的就是出現次數前k個的ip位址

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

判斷數字有沒有在大量資料中出現過,我們可以使用位圖:bitmap,但是點陣圖中,我們使用乙個位元位的0或者1來表示數字有沒有出現過,這個題目中,乙個位元位顯然是不夠的,因為沒有出現我們用00表示,出現一次用01或者10表示,一次以上統一用乙個數字11表示

具體思路如下:

①將100億個整數,按照對應的hash演算法算出來的key值,存到對應的1000個小檔案中

②在從每個檔案中找到出現次數為1的數值

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

該題目相當於上面題目的變形,既然有1g的記憶體,我們就可以每個檔案占用500m,然後將這兩個檔案都分成1000份小檔案,將兩個檔案中的整數分別使用同樣的hash演算法,分別對映到各自的1000個檔案中,因為使用的是同一種hash演算法,所以假如數字x,在兩個檔案中同時存在,那麼肯定對映在同樣下標的小檔案中,此時1表示存在,0表示不存在,將倆個經過hash演算法的檔案「與」一下,那麼在兩個檔案中都存在的數字對應的位置應該是兩個1,「與」了之後還是1,若只在一方存在,那麼肯定是0和1與,結果就是0;都不存在就是0和0與,結果還是0,這樣,與完之後剩下的數字就是在兩個檔案中都存在的數字。

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

解決這個問題和之前的幾個問題大同小異,100億的int,大小大概在40g左右,使用最基礎的點陣圖是不夠的,因為每乙個位元位他所能表示之後狀態,但是我們在不超過2中,有出現0次,出現1次,兩種情況,所以我們使用的應該還是2個位元位,00表示出現0次,10表示出現1次,11表示出現2次即以上,因為有40g,但是記憶體只有1g,所以我們最少要將檔案分成40份,然後在統計每乙份檔案中出現不超過2次的,然後在綜合起來。

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

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

如何擴充套件bloomfilter使得它支援計數操作

找兩個檔案的交集,使用布隆過濾器(bloomfilter),假設每乙個quer的大小等於乙個int的大小,那麼100億個就是40g左右,記憶體只有1g,所以我們檔案分成1000份

具體步驟:

①:將兩個檔案分別分成1000分,使用bloomfilter將兩個檔案中的值分別對映到不同的位置

②再將兩個對映之後的 檔案做比較,使用相同的hash處理函式,得到的key值也就是一樣的,對映的位置在兩個檔案中也是一樣。

那麼如何讓bloomfilter支援刪除元素的操作?我們可以將bloomfilter中的每一位增加乙個計數字,然後在將要刪除這個數的時候,先去判斷計數字是不是0,如果不是0,那麼就說明有其他的數也對映到這個位,此時我們就不能刪除這個位置。

海量資料處理問題

1 給乙個超過100g大小的log le,log中存著ip位址,設計演算法找到出現次數最多的ip位址。如何找到top k的ip 這樣的問題如果出現在資料量較小的情形下,用乙個map或者unordered map都能很快的處理,但是100g這樣的量級放在乙個map裡是絕對不可行的。因此,我們採用雜湊切...

海量資料處理問題之雙層桶劃分

雙層桶劃分 什麼是雙層桶 事實上,與其說雙層桶劃分是一種資料結構,不如說它是一種演算法設計思想。面對一堆大量的資料我們無法處理的時候,我們可以將其分成乙個個小的單元,然後根據一定的策略來處理這些小單元,從而達到目的。適用範圍 第k大,中位數,不重複或重複的數字 基本原理及要點 因為元素範圍很大,不能...

海量資料的處理問題

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