海量數據處理:分治-Hash映射+Bit-map+Bloome Filter

    海量數據處理,就是基於海量數據的查找/統計/運算等操作。海量數據顧名思義,就是有大量的數據,不能一次性裝入內存處理,導致傳統的操作無法實現。對於海量數據的處理,這裏將三個,分別是分治--Hash映射/Bit-map/Bloome Filter。


 1.  分治-Hash映射


    如果兩個散列值不同,那麼這兩個散列值的原始輸入也是不同的。

    基本思想:對於大文件進行處理時,如果文件比較大,無法一次性讀入內存,可以考慮採取Hash映射的方式將文件中的元素映射到不同小文件中,然後依次處理各個小文件,最後合併結果,這樣降低了問題的規模。


2.Bit-map


    Bit-map的原理就是用位數組來表示某元素是否存在,由於採用了bit爲單位來存儲數據,因此在存儲空間方面,可以大大節約空間,可用於海量數據的快速查找/判重/刪除等。

   

3.Bloome Filter

    之前轉載過一篇博客介紹將Bloome Filter用於url去重,我們之前做的爬蟲去重的方式是將歷史的url存入了Leveldb數據庫中,隨着數據庫的元素的增加,需要查找的時間邊長,嚴重的影響了網頁抓取的速度。所以考慮使用Bloome Filter。

    Bloome Filter中文叫布隆過濾器,可以看作是Bit-map的拓展。Bit-map的作法是申請一個N位(N爲集合中最大整數)的數組,然後每一位對應一個特定整數。

    Bloome Filter的基本原理是位數組與Hash函數的聯合使用。Bloome Filter是一個包含了m位的位數組,數組的每一位都初始化爲0,然後定義k個不同的Hash函數,每個Hash函數都可以將集合中的元素映射到數組中的每一位。當向集合中插入一個元素時,根據k個Hash函數就可以得到位數組的k個位,將這些位全部設置爲1。當要查詢某個元素是否在集合中時,就使用k個哈希函數得到此元素對應的k個位,如果所有點都是1,那麼元素在集合內,如果有0,元素不在集合內。


    舉個例子:n個元素的集合爲S={x1,x2,...,xn},查找元素y是否在集合S中。

    第一步,初始化。Bloome Filter使用k個相互獨立的哈希函數,位數組的長度爲m,數組中每一位被初始化爲0。有關k,m參數的確定,可以參考文獻

    第二步,將集合中每個元素根據Hash函數映射到k個位置上,將這些位置置1,如果原來是1,則不用置1。如圖所示:

    這裏寫圖片描述

    第三步,判斷y是否在集合中。對y應用k次哈希函數,如果所有的hi(y)的位置都是1(1<= i <= k),則認爲y是集合中的元素,否則就認爲y不是集合中的元素。

    通常Bloome Filter的位數m比Bit-map的m小的多,是一種空間效率和時間效率很高的隨機數據結構,但是是以犧牲正確率爲代價的。即Bloome Filter通過極小的錯誤換取了存儲空間的極大節省。Bloome Filter不適合那些零錯誤的應用場合。



參考《王道程序員求職寶典》

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