浅谈布隆过滤器在内容管理系统中的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈布隆过滤器在内容管理系统中的应用
摘要:内容管理系统的内容采集主要由爬虫进行搜集,但内容重复与否绝大多数情况下是根据内容所在的页面URI
进行判定。作为一个完善的内容管理系统,必须具备对已有内容资源的识别功能。本文通过介绍布隆过滤器,并与传统的判重方式进行对比,同时改进布隆过滤器并应用于内容管理系统的资源判重的功能中,解决了内存占用无限增加,查询时间不断增长,记录内容无法删除等问题,实现了高效快速的资源判重。
关键词:计算机工程;布隆过滤器;内容管理系统;爬虫;哈希
中图分类号:TP399
文献标识码:A
DOI:10.3969/j.issn.1003-6970.2016.01.008
0 引言
Web信息的采集通常是利用网络爬虫等工具遍历万维网,它把万维网看作一个以网页为节点,网页间链接为边的超大规模有向图,然后利用图的遍历算法对万维网进行遍历。在网络遍历的过程中.需要判断待采集的页面是否已经采集
过了,这就需要把已经采集的网页地址记录下来,组成已采
集网页地址集合(记为:visited-set),当新的采集开始之前,首先判断其地址是否在visited-set中,如在其中,表示网页已经采集,否则采集网页,把网页地址放在visited-set中,从而避免网页的重复采集,浪费资源。为了实现集合中数据的快速查找,需要把URL映射为集合中的地址,这就需要设计一种高效且冲突率低的散列算法;同时由于万维网上网页数据的巨大,普通的Hash算法已经不能满足空间的要求,所以更需要一种节约空间的算法。
本文运用Bloom Filter设计了一种节省空间的大规模数据表示和查找方式,应用到内容管理系统中,以应对海量信息采集中判重的需求,文中分析了布隆过滤器相对于HashMap的优越之处,同时指出布隆过滤器的使用条件和弱点,并针对本系统的自身特点和需求,提出了一种针对过滤器的改进方案并予以实现,运用到该系统中。
1 布隆过滤器
1.1 概念
布隆过滤器是一种空间和时间效率很高的随机访问型数据结构,它利用位数组表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter看似简洁,但这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,BloomFilter不适合那些“零错误”的应用
场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省,同时摒弃了冲突导致的一系列冲突处理。
1.2 集合表示和元素查询
初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。
为了表达S={xl,x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素X,第i个哈希函数映射的位置hi (x)就会被置为1(1≤i≤k)。注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在图2中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。
在判断v是否属于这个集合时,我们对v应用k次哈希函数,如果所有hi (y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。图3中y1就不是集合中的元素。y2或者属于这个集合,或者刚好是一个false positive。
2 布隆过滤器在内容管理系统中的使用
内容管理系统由若干部分构成,其功能主要可以分为三大部分:来源、存储和展示。其中,布隆过滤器主要应用在
来源部分中的去重。
作为内容管理系统,来源主要有两个方面:爬虫和手动上传。对于绝大多数的数据搜集,都是通过爬虫的自动化爬取获得的。因此,在不经过人为的干涉的情况下,如何能够有效地抓取不同的内容,防止重复内容对空间和时间的浪费,才是过滤过程的关键所在。因此,为了能让过滤器有的放矢,首先需要明确爬虫的工作机理。下面对爬虫的工作机制做一个简单的介绍。
2.1 爬虫工作流程
简单来说,爬虫可以归结为一个生产者和消费者的问题。
在爬取内容时经历了从“发现”到“爬取”的过程。“发现”,即为对目标链接的获取,目标来自于初始链接和内容
中存在的链接。一旦发现目标链接之后,就要将其放入待爬取的队列中去,等待“爬取”功能的调用。那么,为了能够快速的判断哪些链接需要访问,哪些已经爬取过,最简单的办法就是,将已经访问过的链接(url)放入集合,在每次将新的链接放入队列之前,首先与集合中的历史信息相比对,若没有,则放入队列,否则丢弃。因此,历史信息的比对模块就应该放在生产者到队列之间,提供过滤作用。最通用的方式即为HashMap进行历史信息的存储,但针对HashMap
的不足之处,本文使用了BloomFilter进行了替换,下面针对HashMap的不足进行了说明。
2.2 HashMap
如图5所示,HashMap的主体是由Entry[]构成的,该数组中的每一个Entry节点都由Key和Value组成。HashMap
通过key.hashcode计算所在entry对应在数组中的下标位置,如果遇到冲突,则以链表的形式储存在链尾。
因此,hashMap首先需要存储对象本身和它的key,其使用场景更趋向于,通过key去获取对象本身,而不仅仅是判断该对象是否存在,这样就会在仅仅需要判断对象是否存在的使用场景下造成极大的浪费,原因如下:
对象本身所需要的空间并不固定,有的对象很大,有的仅仅是基本类型,因此,该空间无法预估。hashmap 本身为了达到快速查找,在0(1)的时间复杂度获取对象的目的,随着对象的加入,需要不断的扩容,这同时造成了时间和空间上的开销,使得”增加历史资源”的性能降低。
为了降低哈希的冲突率,hashmap本身会在资源总量的基础上多预留一部分空间,从而造成浪费。
综合以上HashMap的不足之处,结合“过滤及判重”功能的需求,布隆过滤器的优势非常突出:
1.不需要存储对象本身,只需要知道该对象是否存在。
2.可以在0 (l)时间复杂度内完成对对象存在性的判定。
3.在预估存储目标的数量级后,可基本确定空间大小,不需动态调整。