問題:
在網路爬蟲中,有乙個要考慮的問題,由於網路間的鏈結錯綜複雜,蜘蛛在網路間爬行很可能會形成「環」。為了避免形成「環」,就需要知道蜘蛛已經訪問過那些url。給乙個url,怎樣知道蜘蛛是否已經訪問過呢?有如下幾種方案:
1. 將訪問過的url儲存到資料庫。
2. 用hashset將訪問過的url儲存起來。那只需接近o(1)的代價就可以查到乙個url是否被訪問過了。
3. url經過md5或sha-1等單向雜湊後再儲存到hashset或資料庫。
4. bit-map方法。建立乙個bitset,將每個url經過乙個雜湊函式對映到某一位。
方法1~3都是將訪問過的url完整儲存,方法4則只標記url的乙個對映位,即是布隆過濾的方法。
在我前面文章中提到過,我實現了乙個垂直爬蟲,使用的是第 2 種和第 3 種方法的綜合。但是效率是不高的,因為對於每乙個 url 如果沒有在 hashset 中命中,就要去查詢資料庫,對於每乙個 url 都去查詢資料庫,效率可想而知。實際上,在爬蟲中,我們可以允許一部分 url 不爬取,但是不能允許乙個 url 被重複爬取。布隆過濾器剛好演算法這種需求,允許有「命中」的誤判。
我們定義乙個 m 位的unsigned int(或者由多個 unsigned int 組合而成)n,引入 k 個 hash 函式,針對每乙個 url ,分別進行 hash,得到 k 個數字 x。將 n 的第 x 位都標記為1。
查詢 url 是否已經被處理過,就是要判斷 url 的 對應的那些 hash 位是否全為1.如果不全為1,則一定沒有處理過,否則很有可能處理過。如圖1.
布隆過濾器(Bloom Filter)
1.簡介 布隆過濾器是一種多雜湊函式對映的快速查詢演算法。它可以判斷出某個元素肯定不在集合裡或者可能在集合裡,即它不會漏報,但可能會誤報。通常應用在一些需要快速判斷某個元素是否屬於集合,但不嚴格要求100 正確的場合。2.原理 首先需要k個hash函式,每個函式可以把key雜湊成為1個整數 初始化時...
布隆過濾器(BloomFilter)
名稱 問題解決方法 快取穿透 查詢了乙個不存在的資料 布隆過濾器 快取擊穿 某個key的快取失效 互斥鎖快取雪崩 多個key的快取同時失效 失效時間 隨機時間 底層是乙個bit二進位制向量或叫 bit 陣列,bit 裡存放的資料非0即1。通過雜湊函式將元素對映到bit的相應位置,並將此位置置為1。如...
布隆過濾器(Bloom Filter)
布隆過濾器 bloom filter 是由布隆 burton howard bloom 在1970年提出的。它實際上是由乙個很長的二進位制向量 位向量 和一系列隨機對映函式組成,布隆過濾器可以用於檢索乙個元素是否在乙個集合中。基本思想 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲...