海量數據處理,就是基於海量數據的查找/統計/運算等操作。海量數據顧名思義,就是有大量的數據,不能一次性裝入內存處理,導致傳統的操作無法實現。對於海量數據的處理,這裏將三個,分別是分治--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不適合那些零錯誤的應用場合。
參考《王道程序員求職寶典》