海量數據處理

海量數據處理

我們這裏的海量數據處理主要是通過幾個實際問題,應用數據結構,來熟悉哈希數據結構,位圖數據結構,和布隆過濾器。如果哈希數據結構,位圖數據結構和布隆過濾器
請點擊[https://github.com/jacksparrowwang/cg19.github.com/tree/master/Data%20Structure](github)

海量數據的處理問題,遇到的問題一般有文件過大無法加載到內存,文件內容龐雜無法很快搜素到想要的內容,還有一個問題,如何在龐大的數據中統計出想要的內容。

北冥有魚,其名爲鯤,鯤之大,一鍋燉不下

這就像大數據一樣。那麼我們來如何處理呢?實例來分析

  1. 給定一個大小超過 100G 的文件, 其中存在 IP 地址, 找到其中出現次數最多的 IP 地址(hash文件切分)

    這裏給定了一個100G的文件,其中內容很多,但是要我們找到其中存在IP,而且是出現次數最多的IP地址。這時候有人會說,讓電腦一點一點去找,但是這裏100G要全是IP地址,那麼在一般電腦上是無法加載的,就算有那這裏我們要在空間上實現優化。這裏就像前面的北冥有魚,其名爲鯤,鯤之大,一鍋燉不下啊。
    那麼沒我們就得想辦法,我們可以採用哈希切分的辦法來進行切分數據,把數據分成若干分,然後逐一去加載到內存中去統計。
    哈希切分
    何爲哈希切分。哈希切分,就是利用哈希值,來進行切分,然後把相同的值放入到一個集合中。比如我們現在要把100g的文件切分成100份(如果覺得100份後依然很大那麼我們可以切割成1000份),那麼讀取每一個文件內容,計算它的哈希值,讓其模100,如果等於0,就放入0號集合中,如果等於1就放入1號集合中,依次循環。那麼等到把所有的元素遍歷完,那麼100個集合也就成功的形成(哈希算法夠複雜計算出哈希值分佈夠均勻)。在這集合中相同的IP一定在同一個集合中。因爲相同的IP所對應的哈希值一定相同。到這時我們在讓它加載到內存中進行統計,這樣我們就把一鍋燉不下的問題轉變成了多個鍋分開燉。

  2. 給定100億個整數, 找到其中只出現一次的整數(位圖變形, 用兩位來表示次數).

    這個題解題的主要思想是要進行空間上面的優化,查找很簡單,但是要進行大數據的查找,時間上雖說讓其久一點,但空間的消耗也是巨大,那麼我們如何減小空間上的開銷呢?
    那麼我們在學習一種數據結構叫位圖,位圖其實就是以最小的空間來標記是否存在要查找的元素。這裏我們要得是找到出現一次的整數,位圖中是採用了一個比特位來表示是否存在,查找是否存在一次那麼我們就可以用兩位比特位來表示,比如用00表示沒有,用01表示出現一次用10表示不是此數據,此數據絕對出現超過三次那麼我們就可以繼續查找。
    這樣做的好處就是大大優化了空間上的開銷,同時對於這種思想,我們還可以進行改進,比如需要找出出現5次的數據那麼我們就可以用三位比特位來表示。

  3. 有兩個文件, 分別有100億個query(查詢詞, 字符串), 只有1G內存, 找到兩個文件的交集(hash文件切分 + 布隆過濾器).

    前面已經提到對於大數據內容進行查找統計,我們用到是哈希切分,哈希切分的主要作用就是很大程度上優化了空間上的消耗。
    這裏有兩個文件都是100億個query,那麼我們在進行統計時候,用哈希切分來進行切分,比如我們現在要把數據分成100份那麼,取每個數據進行求哈希值,然後模100,如果模值等於0,那麼我們就把它歸爲0號集合,再將其插入到布隆過濾器中,讓然後讓另一個文件也進行哈希切分,並且切分成100份,模以100,等於0,就歸於0號集合,然後將這個0號集合到布隆過濾器中的0號元素進行查找,這樣我們就可以找到0號元素中的交集,那麼我們再進行下一個集合的查找,以此類推。。。

  4. 給上千個文件, 每個文件大小爲1K - 100M, 設計算法找到某個詞存在在哪些文件中(倒排索引).

    這個問題就類似於一些搜索引擎,比如百度,當輸入一個或者兩個關鍵字時,會很快返回上百個或者上千個文件鏈接。那麼他們是怎麼做到的呢?
    這個現實利用哈希表,鍵值對來進行倒排索引,哈希表的實現,如果不知道哈希表的實現請戳上面鏈接。哈希表正向是一個key對用一個value那麼我們用開,我們給文件進行編號,通過編號我們就可以找到相應的value,這是正向索引,那麼現在我們來倒過來,文件中的關鍵字作爲key,文件的編號作爲value,那麼我們就可以很輕鬆的找到文件。
    這裏寫圖片描述
    關於搜索引擎的關鍵字搜索,是分爲兩種服務器,一種是線上服務器,就像現在你打開百度搜索,一種是線下服務器,爲什麼還要有個線下服務器呢?這就是爲了實現倒排索引,也是爲了提高效率,就比如百度,在百度上會定期的更新數據,這樣就會把新添加的數據抓取下來,進行關鍵字和編號的對應,然後讓線上服務器進行加載,就可以了。

    哈希切分其他用處

    一般大公司服務器,不可能爲一臺,那麼就會遇到一個問題,如果有人登陸到服務器,如何在巨大的服務器羣體中快速的找到,並且登陸呢?那麼在設計服務器羣體時,就進行了哈希切分,比如在你註冊的時候就把你得賬號密碼進行哈希計算,然後通過模取到幾就會把你得賬號分到哪臺服務器上管理,這樣,就可以大大減少了挨個查找所消耗的時間。

如有錯誤,還望指正,謝謝。

發佈了74 篇原創文章 · 獲贊 35 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章