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

在爬虫系统中,在内存中维护着两个关于URL的队列,ToDo队列和Visited队列,ToDo队列存放的是爬虫从已经爬取的网页中解析出来的即将爬取的URL,但是网页是互联的,很可能解析出来的URL是已经爬取到的,因此需要VIsited队列来存放已经爬取过的URL。当爬虫从ToDo队列中取出一个URL的时候,先和Visited队列中的URL进行对比,确认此URL没有被爬取后就可以下载分析来。否则舍弃此URL,从Todo队列取出下一个URL继续工作。

然后,我们知道爬虫在爬取网页时,网页的量是比较大的,直接将所有的URL直接放入Visited队列是很浪费空间的。因此引入bloom filter!

(关于使用bloomfilter的原因:

visited队列中url过多,消耗内存空间是一方面。还有一个重要的原因,在从todo队列中取出一个新的URL时,必须和 visited中所有URL比较,确保没有处理过。那么如果直接比较的话,是要比较N(visited中所有url个数)次的,而且这个N相当大,效率明 显不够。采用bloom filter,最多只要比较K(我在文章中写的,相互独立的散列函数的个数)次,因为只要一个散列函数的散列值对应的位是0,就可以确定这个URL没有处 理过。

)

我们把bloom filer设置为m个bit,全部初始为0。

对每一个URL,进行K(K

经过上述处理的bloom filter实际上构成了我们所说的Visited队列,当我们从ToDo队列中取出一个新的URL时,同样,进行相同的K次哈希,每进行一次哈希,查看bloom filter中对应位,只要发现某位是0,就可以确定这个URL是没有处理过的,可以继续下载处理。

那么,原理清楚之后,还有几个问题没有解决。

1、bloom filter是有可能发生错误的,因为不处理碰撞,也就是说,有可能把不属于这个集合的元素误认为属于这个集合

错误率的计算:

在n个URL都进行k次散列加入之后,bloomfilter中某位是0的概率

1240de822b4d66c805e95e1ff51cf63b.png

错误率(即一个新的URL恰好k次散列的值对应的位都已经是1的概率)

49bdd1c6dbd8d85fa9c94a83b78eb7b0.png

2、哈希函数个数K的确定

k = ln2· (m/n)时(具体数学分析见http://blog.csdn.net/jiaomeng/article/details/1495500)

3、bloomfilter位数M的确定

我们可以想到,M的大小越大,错误率就会越小,但是数学证明给出了一个下界。即M = log2eN = 1.44N。

附上java代码

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 /**屈永泉 布隆过滤器 快速确定哪些网页已经被下载过*/

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) { //产生八个随机数并返回

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 //将一个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]); //将指定索引处的位设置为 true

24 }25 }26

27 //判断一个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转换为一个新的字符数组

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java php js_【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景...

本文将从以下11点介绍javascript和PHP在基础语法和基本操作上的异同&#xff1a;1.数据类型的异同2.常量和变量的定义的不同&#xff0c;字符串连接运算符不同3.对象的创建方法的不同4.PHP与JS在变量声明提升和函数声明提升的差异5.var在JS和PHP中使用的差异6.PHP和JS在访问对象…

从零开始学java 框架_从零开始学 Java - 搭建 Spring MVC 框架

如果创建一个 Spring 项目Spring MVC 框架在 Java 的 Web 项目中应该是无人不知的吧&#xff0c;你不会搭建一个 Spring 框架&#xff1f;作为身为一个刚刚学习Java的我都会&#xff0c;如果你不会的话&#xff0c;那可真令人忧伤。1.在 MyEclipse 创建项目后&#xff0c;可以以…

java 系统类型_Java获取操作系统类型

Java获取操作系统完整版系统枚举类&#xff1a;public enum EPlatform {Any("any"),Linux("Linux"),Mac_OS("Mac OS"),Mac_OS_X("Mac OS X"),Windows("Windows"),OS2("OS/2"),Solaris("Solaris"),SunOS…

azure mysql on vnet_管理 VNet 终结点 - Azure 门户 - Azure Database for MySQL | Microsoft Docs

您现在访问的是微软AZURE全球版技术文档网站&#xff0c;若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站&#xff0c;请访问 https://docs.azure.cn.使用 Azure 门户创建和管理 Azure Database for MySQL VNet 服务终结点和 VNet 规则Create and manage Azure D…

java jmap jc_利用jmap命令查看JVM内存使用详情

介绍打印出某个java进程(使用pid)内存内的&#xff0c;所有‘对象’的情况(如&#xff1a;产生那些对象&#xff0c;及其数量)。它的用途是为了展示java进程的内存映射信息&#xff0c;或者堆内存详情。可以输出所有内存中对象的工具&#xff0c;甚至可以将VM 中的heap&#xf…

雅居乐万豪酒店java_“万豪,我心所属之地” | 上海雅居乐万豪酒店Terence Sun的实习故事...

​我叫孙庭骏&#xff0c;来自台北&#xff0c;目前就读瑞士恺撒里兹酒店管理学院&#xff0c;在来上海之前曾在瑞士苏黎世万豪酒店的餐饮部实习过两次&#xff0c;共一年的时间&#xff0c;所以万豪对我来说并不陌生。万豪一直深深吸引我的莫过于它的核心价值以及非凡待客之道…

java quartz spring_JavaLib-quartz | 基于Spring Boot Quartz开发的定时任务

基于Spring Boot Quartz开发的JavaLib-quartz&#xff0c;目的是帮你快速构建定时任务系统&#xff0c;你可以专心编写你的业务逻辑&#xff0c;而不必关注定时任务具体是如何实现的&#xff0c;他的性能如何&#xff0c;有没有异常以及异常处理&#xff0c;监控等等问题。这些…

java static 加载顺序_一个例子搞清楚Java类加载顺序

当我们new一个GirlFriend时&#xff0c;我们都做了什么&#xff1f;一个例子搞懂Java程序运行顺序public class Girl {Person person new Person("Girl");static{System.out.println("Girl static");}static Person staticPerson new Person("GirlS…

java 轻量数据库_DBTree是一个springboot2 + vue-element-template实现的轻量数据库表结构查看及管理工具...

DBTree简介DBTree是一个WEB版的轻量数据库表结构查看及管理工具&#xff0c;相比phpMyAdmin, DBTree只专注于方便开发查看表结构信息和 注释维护。通过树形展示库表结构&#xff0c;可以对表进行自定义归类&#xff0c;在线更新注释。你还可以使用它来部分替代mybatis generato…

java通用异常_Java常用异常整理

填坑&#xff0c;整理下Java的常用异常。正确使用异常在实际编码中非常重要&#xff0c;但面试中的意义相对较小&#xff0c;因为对异常的理解和应用很难通过几句话或几行代码考查出来&#xff0c;不过我们至少应答出三点&#xff1a;异常类的继承关系、常用异常类、常用异常类…

java 移动页面中的图片上传_移动端上传图片(ajax跨域请求)

第一次写项目开发经验&#xff0c;望担待。除了前端以外的事就不叨叨了&#xff0c;下面开始弄干活(两个页面首页、列表页)。项目开发简述项目需求&#xff1a;上传图片并展示。项目地址&#xff1a;项目的链接地址开发工具&#xff1a;sublime后台&#xff1a;java开发语言&am…

php session 反序列化,PHP SESSION反序列化本地样例分析

PHP SESSION反序列化本地样例分析0X00漏洞原因主要原因是&#xff1a; ini_set(‘session.serialize_handler’, ‘php_serialize’);ini_set(‘session.serialize_handler’, ‘php’);两者处理session的方式不同。0X01漏洞分析如果在PHP在反序列化存储的$_SESSION数据时使用的…

php 标题去重复思想,WordPress网站发布文章时如何防止发布重复标题的文章?

事实上&#xff0c;所有插件后端代码都等同于将代码片段添加到functions.php中&#xff0c;functions.php代码片段可以生成插件&#xff0c;然后插件可以自然地集成到functions.php中。插件主要易于管理&#xff0c;但也增加了静态资源请求的数量。如果您知道如何处理这些请求&…

无法连接iphone软件更新服务器_苹果发布了iphone、ipad和mac的新软件更新

苹果已经发布了三种操作系统的软件更新&#xff1a;用于iphone和ipod的iOS、ipad的iPadOS和Macs的macOS。这些更新很小&#xff0c;主要集中在bug修复上&#xff0c;而不是添加新功能。这些更新标记为iOS 13.6.1、iPadOS 13.6.1和macOS 10.15.6补充更新。通常&#xff0c;iOS或…

win10升级助手_关闭win10系统更新

为什么要拒绝更新系统呢&#xff1f;&#xff1f;&#xff1f;1.系统更新占用太多时间2.不合时宜的提醒更新严重影响了工作3.对绝大多数人完全没有必要更新系统微软强奸式的要求更新不合清理。同学们的电脑系统大多数是win10家庭版&#xff0c;可以采用下面方案关闭自动更新&am…

matlab 生成信号文件,生成的代码如何存储内部信号、状态和参数数据

浏览模型示例打开模型示例 rtwdemo_roll。open_system(rtwdemo_roll)该模型包含不连接到根级别 Inport 或 Outport 模块的内部信号。某些信号具有名称&#xff0c;例如 phiCmd 信号。该模型还包含一些维护状态数据的模块。例如&#xff0c;在 BasicRollMode 子系统中&#xff0…

苹果平板怎么卸载软件_怎么很好的卸载流氓软件!

我相信在生活当中&#xff0c;很多人都会在不知情或者不注意的情况下&#xff0c;被迫下载很多自己不想要的软件&#xff0c;而且删除之后总是出现&#xff0c;挥之不去。接下来我将会给大家分享几个下载此类软件的方法&#xff1a;一、通过控制面板卸载点击小图标&#xff0c;…

python 循环语句结果存储_python条件语句和循环语句

一、条件语句Python 条件语句跟其他语言基本一致的&#xff0c;都是通过一条或多条语句的执行结果&#xff08; True 或者 False &#xff09;来决定执行的代码块。 Python 程序语言指定任何非 0 和非空&#xff08;null&#xff09;值为 True&#xff0c;0 或者 null为 False。…

使用c++查看linux服务器某个进程正在使用的内存_精选20个常用的Linux命令

今天总结几个非常常用的Linux命令&#xff0c;其中有几个在面试中很可能问相关命令的原理&#xff0c;比如后台运行命令。希望对大家有所帮助&#xff0c;最好自己去尝试在Linux操作系统中实践一下。1 查看目录以及权限在windows中&#xff0c;使用dir查看当前目录中文件。在Li…

台式电脑可以连wifi吗_不使用WIFI,手机也可以通过电脑的网络上网

让手机通过电脑上网的方式有很多种&#xff0c;最常见的就是 WIFI 了&#xff0c;而且简单直接。但是有时候台式机没有 WIFI &#xff0c;或者电脑的 WIFI 设备已经连接到其他的网络了&#xff0c;这时候手机就不能通过电脑的 WIFI 连接到网络。那么还没有有办法连接到网络呢&a…