Bloom Filter 海量資料處理

2022-05-16 02:20:53 字數 1279 閱讀 4946

先來看這樣乙個爬蟲相關問題:檔案a中有10億條url,每條url占用64位元組,機器的記憶體限制是4g,現有乙個url,請判斷它是否存在於檔案a中(爬過的url無需再爬)。如果有很多個url需要判斷呢?

分析之後我們可以發現,這就是快速query問題,通常查操作居多,寫操作較少。要快速判斷乙個url是否在檔案a中,由於

\[ \]

而60g是放不進記憶體的,所以逐個讀入記憶體判斷的話,時間複雜度起碼是o(10億),這顯然不能滿足要求。如何節約記憶體又可以節省時間才是關鍵!bloom filter就是解決這種問題的資料結構,主要是能很好地節省記憶體。

bloom filter (下簡稱bf)在海量資料方面的處理表現不錯,它的內部需要的結構有:

乙個url依次經過k個hash函式後得到k個數字,設為\(\),置bitset[\(\)] = 1。先將a檔案中的url都這樣處理,那麼得到的bitset就是記錄了與檔案a相關的資訊。將60gb的檔案資訊壓縮成m個bit,如果能很好利用這m個bit,那記憶體將大大減少。

如何利用bitset[m]

對於每個詢問的url,經過這k個hash函式之後同樣能得到k個數字,設為\(\),如果有

\\& bitset \& } \cdots ]}

\]說明此url可能存在於a中,但是目前不能確定是否存在;如果有

\\& bitset \& } \cdots ]}

\]那就可以確定此url不在a中。對於此url是否一定存在於檔案a中,bloom filter無法給出肯定的答覆。設n為資料量(即10億),m為bitset大小(即槽個數),k為hash函式個數,則它的錯誤率公式是

\[)^]^≈(1-e^})^}

\]從上式中知道,

看回最上面的問題,檔案a在4gb記憶體中能達到的最低錯誤率是多少?

其實有3個因素決定了錯誤率,nmk,其中n與資料量掛鉤,m與空間掛鉤,k與時間掛鉤,既然n已固定為10億,m已固定約為32gb,那麼k的大小將決定錯誤率的大小。分析一下,預處理時需要先將n個資料都進行hash成k個數,所以時間複雜度為o(n*k),而預處理完後每個查詢僅需時間複雜度o(k)。

關於證明,如果有興趣可以去維基上看。

Bloom Filter 海量資料過濾的發動機

部分內容參考這位大神的 在保證一定高效空間效率和一定的出錯率的前提下判斷元素是不是集合中的成員。而存在的錯誤只可能存在於元素位於集合中,對於元素不存在集合中的情況是不會產生錯誤的情況的。由於存在一定的可能低錯誤,則不適用於 0錯誤 的場合。如果存在上百萬量的資料的時候,如何判斷集合r中是否已經存在元...

海量資料處理之Bloom Filter詳解

本部落格內曾已經整理過十道海量資料處理面試題與十個方法大總結。接下來,本部落格內會重點分析那些海量資料處理的方法,並重寫十道海量資料處理的面試題。如果有任何問題,歡迎不吝指正。謝謝。bloom filter是一種空間效率很高的隨機資料結構,它的 原理是,當乙個元素被加入集合時,通過k個hash函式將...

Bloom Filter 資料結構的應用

應用1 儲存字典。大家可能對於 word 的拼寫檢查功能非常了解,當你拼錯乙個單詞的時候,word 會自動將這個單詞用紅線標註出來。word 的具體工作原理不得而知,但是在另乙個拼寫檢查器 unix spell checkers 這個軟體中用到了 bloom filter。unix spell ch...