日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java bloomfilter_爬虫技术之——bloom filter(含java代码)

發(fā)布時(shí)間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java bloomfilter_爬虫技术之——bloom filter(含java代码) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在爬蟲系統(tǒng)中,在內(nèi)存中維護(hù)著兩個(gè)關(guān)于URL的隊(duì)列,ToDo隊(duì)列和Visited隊(duì)列,ToDo隊(duì)列存放的是爬蟲從已經(jīng)爬取的網(wǎng)頁(yè)中解析出來的即將爬取的URL,但是網(wǎng)頁(yè)是互聯(lián)的,很可能解析出來的URL是已經(jīng)爬取到的,因此需要VIsited隊(duì)列來存放已經(jīng)爬取過的URL。當(dāng)爬蟲從ToDo隊(duì)列中取出一個(gè)URL的時(shí)候,先和Visited隊(duì)列中的URL進(jìn)行對(duì)比,確認(rèn)此URL沒有被爬取后就可以下載分析來。否則舍棄此URL,從Todo隊(duì)列取出下一個(gè)URL繼續(xù)工作。

然后,我們知道爬蟲在爬取網(wǎng)頁(yè)時(shí),網(wǎng)頁(yè)的量是比較大的,直接將所有的URL直接放入Visited隊(duì)列是很浪費(fèi)空間的。因此引入bloom filter!

(關(guān)于使用bloomfilter的原因:

visited隊(duì)列中url過多,消耗內(nèi)存空間是一方面。還有一個(gè)重要的原因,在從todo隊(duì)列中取出一個(gè)新的URL時(shí),必須和 visited中所有URL比較,確保沒有處理過。那么如果直接比較的話,是要比較N(visited中所有url個(gè)數(shù))次的,而且這個(gè)N相當(dāng)大,效率明 顯不夠。采用bloom filter,最多只要比較K(我在文章中寫的,相互獨(dú)立的散列函數(shù)的個(gè)數(shù))次,因?yàn)橹灰粋€(gè)散列函數(shù)的散列值對(duì)應(yīng)的位是0,就可以確定這個(gè)URL沒有處 理過。

)

我們把bloom filer設(shè)置為m個(gè)bit,全部初始為0。

對(duì)每一個(gè)URL,進(jìn)行K(K

經(jīng)過上述處理的bloom filter實(shí)際上構(gòu)成了我們所說的Visited隊(duì)列,當(dāng)我們從ToDo隊(duì)列中取出一個(gè)新的URL時(shí),同樣,進(jìn)行相同的K次哈希,每進(jìn)行一次哈希,查看bloom filter中對(duì)應(yīng)位,只要發(fā)現(xiàn)某位是0,就可以確定這個(gè)URL是沒有處理過的,可以繼續(xù)下載處理。

那么,原理清楚之后,還有幾個(gè)問題沒有解決。

1、bloom filter是有可能發(fā)生錯(cuò)誤的,因?yàn)椴惶幚砼鲎?#xff0c;也就是說,有可能把不屬于這個(gè)集合的元素誤認(rèn)為屬于這個(gè)集合

錯(cuò)誤率的計(jì)算:

在n個(gè)URL都進(jìn)行k次散列加入之后,bloomfilter中某位是0的概率

錯(cuò)誤率(即一個(gè)新的URL恰好k次散列的值對(duì)應(yīng)的位都已經(jīng)是1的概率)

2、哈希函數(shù)個(gè)數(shù)K的確定

k = ln2· (m/n)時(shí)(具體數(shù)學(xué)分析見http://blog.csdn.net/jiaomeng/article/details/1495500)

3、bloomfilter位數(shù)M的確定

我們可以想到,M的大小越大,錯(cuò)誤率就會(huì)越小,但是數(shù)學(xué)證明給出了一個(gè)下界。即M = log2eN = 1.44N。

附上java代碼

1 /**屈永泉 布隆過濾器 快速確定哪些網(wǎng)頁(yè)已經(jīng)被下載過*/

2

3 package crawler;4

5 import java.util.BitSet;6

7 public classBloomFilter {8 private int defaultSize = 5000 << 10000;9 private int basic = defaultSize - 1;10 private BitSet bits = newBitSet(defaultSize);11

12 private int[] lrandom(String key) { //產(chǎn)生八個(gè)隨機(jī)數(shù)并返回

13 int[] randomsum = new int[8];14 for (int i = 0; i < 8; i++)15 randomsum[0] = hashCode(key, i + 1);16 returnrandomsum;17 }18

19 //將一個(gè)URL加入

20 public synchronized voidadd(String key) {21 int keyCode[] =lrandom(key);22 for (int i = 0; i < 8; i++)23 bits.set(keyCode[i]); //將指定索引處的位設(shè)置為 true

24 }25 }26

27 //判斷一個(gè)URL是否存在

28 publicboolean exist(String key) {29 int keyCode[] =lrandom(key);30 if (bits.get(keyCode[0])31 && bits.get(keyCode[1]) //返回指定索引處的位值。

32 && bits.get(keyCode[2]) && bits.get(keyCode[3])33 && bits.get(keyCode[4]) && bits.get(keyCode[5])34 && bits.get(keyCode[6]) && bits.get(keyCode[7])) {35 return true;36 }37 return false;38 }39

40

41 private int hashCode(String key, intQ) {42 int h = 0;43 int off = 0;44 char val[] = key.toCharArray(); //將此URl轉(zhuǎn)換為一個(gè)新的字符數(shù)組

45 int len =key.length();46 for (int i = 0; i < len; i++) {47 h = (30 + Q) * h + val[off++];48 }49 return basic &h;50 }51

52

53 /*public static void main(String[] args) { // TODO Auto-generated method54 long pre = 0;55 long post = 0;56 pre = System.nanoTime();57 BloomFilter f = new BloomFilter(); //初始化58 f.add("http://www.agrilink.cn/"); f.add("http://www.baidu.com/");59 System.out.println(f.exist("http://www.baidu.com/"));60 System.out.println(f.exist("http://www.baidud.com/"));61 post = System.nanoTime();62 System.out.println("Time: " + (post - pre));63

64 }65 */

66

67 }

View Code

總結(jié)

以上是生活随笔為你收集整理的java bloomfilter_爬虫技术之——bloom filter(含java代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。