1. 程式人生 > >BloomFilter–大規模資料處理利器

BloomFilter–大規模資料處理利器

Bloom Filter是由Bloom1970年提出的一種多雜湊函式對映的快速查詢演算法。通常應用在一些需要快速判斷某個元素是否屬於集合,但是並不嚴格要求100%正確的場合。

例項

  為了說明Bloom Filter存在的重要意義,舉一個例項:

  假設要你寫一個網路爬蟲程式(web crawler)。由於網路間的連結錯綜複雜,爬蟲在網路間爬行很可能會形成。為了避免形成,就需要知道爬蟲程式已經訪問過那些URL。給一個URL,怎樣知道爬蟲程式是否已經訪問過呢?稍微想想,就會有如下幾種方案:

1. 將訪問過的URL儲存到資料庫。

2. 

HashSet將訪問過的URL儲存起來。那隻需接近O(1)的代價就可以查到一個URL是否被訪問過了。

3. URL經過MD5SHA-1等單向雜湊後再儲存到HashSet或資料庫。

4. Bit-Map方法。建立一個BitSet,將每個URL經過一個雜湊函式對映到某一位。

  方法1~3都是將訪問過的URL完整儲存,方法4則只標記URL的一個對映位。

  以上方法在資料量較小的情況下都能完美解決問題,但是當資料量變得非常龐大時問題就來了。

  方法1的缺點:資料量變得非常龐大後關係型資料庫查詢的效率會變得很低。而且每來一個URL就啟動一次資料庫查詢是不是太小題大做了?

  方法2的缺點:太消耗記憶體。隨著URL的增多,佔用的記憶體會越來越多。就算只有1億個URL,每個URL只算50個字元,就需要5GB記憶體。

  方法3:由於字串經過MD5處理後的資訊摘要長度只有128BitSHA-1處理後也只有160Bit,因此方法3比方法2節省了好幾倍的記憶體。

  方法4消耗記憶體是相對較少的,但缺點是單一雜湊函式發生衝突的概率太高。還記得資料結構課上學過的Hash表衝突的各種解決方法麼?若要降低衝突發生的概率到1%,就要將BitSet的長度設定為URL個數的100倍。

. Bloom Filter的演算法

廢話說到這裡,下面引入本篇的主角

–Bloom Filter。其實上面方法4的思想已經很接近Bloom Filter了。方法四的致命缺點是衝突概率高,為了降低衝突的概念,Bloom Filter使用了多個雜湊函式,而不是一個。

   Bloom Filter演算法如下:

建立一個mBitSet,先將所有位初始化為0,然後選擇k個不同的雜湊函式。第i個雜湊函式對字串str雜湊的結果記為histr),且histr)的範圍是0m-1 

(1) 加入字串過程

  下面是每個字串處理的過程,首先是將字串str“記錄BitSet中的過程:

  對於字串str,分別計算h1str),h2str…… hkstr)。然後將BitSet的第h1str)、h2str…… hkstr)位設為1

 

  很簡單吧?這樣就將字串

相關推薦

no