`
javatgo
  • 浏览: 1212157 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

快速URL排重的方法(一)

阅读更多

我这里介绍一个极适合大量URL快速排重的方法,这个算法被称为Bloom filter,基本上,它也只适合这样的场合。

这里的大量是指有5000万至1亿的URL,更大的数据量可能也不合适了。

一开始我使用了一个最复杂的做法,是有一个单独的daemon程序负责排重,数据和排重结果通过socket传输。
后来发现不行,仅仅几百万数据要做好几个小时,5000万不把人都急疯了?至于daemon中具体用什么算法就次要了,因为一涉及到网络通讯,速度再快也被拉下来(这里针对的是发送一条记录/返回一条结果的模式,一次传送一批数据则与网络状况有关了)

所以,把目标锁定在单机排重,一开始,试验了perl中的hash,非常简单的代码

useDB_File;
my%db;
#tie%db,'DB_File',"createdb.dat",ordie"Can'tinitializedb::$! ";
while(<>){
chomp$_;
$db{$_}=1;#addcodehere
}
#untie%db;

从标准输入或文件中每行一个URL读入,插入到perl内置的hash表中,这就成了,需要输出结果则预先判断一下插入的key是否存在。

这个方法速度很快,可惜的是,它占用内存太大,假设1个URL平均50字节,5000万个URL需要2.5G内存。

于是又想到一个方法,把部分数据放入硬盘空间,perl中也提供一个现成的模块DB_File,把上面代码中的注释去掉,就可使用DB_File了,用法与hash一样,只是内部用数据库实现的。

测试了一下,速度明显下降了一个档次,仅40万的数据就要1分钟,关键还在于随着数据量的增加,速度下降加快,两者不呈线性关系。

数据量大的时候,有可能用MySQL的性能会比DB_File好,但是总体上应该是一丘之貉,我已经不抱期望了。

也许DB_File可以优化一下,使用更多的内存和少量的硬盘空间,不过这个方案还是太复杂,留给专家解决吧,一般来说,我认为简单的方法才有可能做到高效。

下面我们的重点对象隆重登场:Bloom filter。简单的说是这样一种方法:在内存中开辟一块区域,对其中所有位置0,然后对数据做10种不同的hash,每个hash值对内存bit数求模,求模得到的数在内存对应的位上置1。置位之前会先判断是否已经置位,每次插入一个URL,只有当全部10个位都已经置1了才认为是重复的。

如果对上面这段话不太理解,可以换个简单的比喻:有10个桶,一个桶只能容纳1个球,每次往这些桶中扔两个球,如果两个桶都已经有球,才认为是重复,问问为了不重复总共能扔多少次球?

10次,是这个答案吧?每次扔1个球的话,也是10次。表面上看一次扔几个球没有区别,事实上一次两个球的情况下,重复概率比一次一个球要低。Bloom filter算法正式借助这一点,仅仅用少量的空间就可以进行大量URL的排重,并且使误判率极低。

有人宣称为每个URL分配两个字节就可以达到0冲突,我比较保守,为每个URL分配了4个字节,对于5000万的数量级,它只占用了100多M的空间,并且排重速度超快,一遍下来不到两分钟,极大得满足了我的欲望。

今天时间不够,下一篇再贴代码

分享到:
评论

相关推荐

    高效的基于段模式的恶意URL检测方法

    本文介绍了一种新的高效恶意URL检测方法,该方法基于段模式分析,并利用倒排索引来加速模式匹配过程。随着互联网技术的迅速发展,网络攻击手段日益多样化且复杂化,恶意URL作为其中一种重要的攻击媒介,其识别变得尤...

    桌面图标任我排

    URL文件(如"wz123.com 网址之家.url"和"桌面图标任我排 官方网站.url")通常包含书签功能,可以直接在桌面打开常用网址,方便用户快速访问常用网页,尤其是对于经常需要查阅特定网站的人来说,这是一种节省时间的...

    python_百度快排(附源码核心).zip

    每种搜索引擎的算法都有所不同,因此针对每个平台的快排方法可能需要调整。 压缩包中的文件名“不会使用点击这里.txt”可能是一个说明文档,指导用户如何使用提供的源代码。而“【资源楼】站群程序源码分享.url”...

    电信设备-一种基于Nutch的Web信息提取方法和系统.zip

    1. **种子URL设置**:首先,用户需要定义一组初始的URL(种子),这些URL是Nutch开始爬取的起点。 2. **网络爬取**:Nutch使用HTTP协议下载网页,并将下载的页面存储在数据库中。它还根据网页上的链接关系构建出一...

    QT5开发seo快排点击软件源码

    "seo快排"是一种策略,旨在通过模拟用户点击来快速提升目标网页在搜索结果中的位置,但这通常被视为黑帽SEO技术,因为它们违反了搜索引擎的规则。 "黑帽SEO"是指使用不道德或违反搜索引擎政策的方法来提高网站排名...

    U盘AutoRun Pro软件使用方法.docx

    2. 按钮的添加和设置:在软件工具栏上有一排邮票状的按钮,选中"添加按钮",然后在窗体上的任意位置点击鼠标左键,就会在上面创建一个按钮。 3. 按钮的标题和图标的设置:可以用鼠标拖动按钮到相应的位置,或者改变...

    海量数据处理的方法

    **定义**: Bloom Filter是一种高效的数据结构,用于快速判断一个元素是否在一个集合中。它使用位数组和多个哈希函数来实现。虽然Bloom Filter可能会产生误报(即错误地报告一个元素属于集合),但它不会漏报。 **...

    手把手教你seo优化之一_SEO优化快速排名技术

    这个教程可能包含的"手把手教你SEO优化之一_SEO优化快速排名技术.exe"可能是实际的软件或课程,"使用说明.txt"提供了如何使用该资源的指南,而".url"文件可能是指向更多网络赚钱资源或SEO帮助信息的链接。...

    css,php,mysql,javascript快速查询表

    这些速查表通常以简洁明了的形式呈现,帮助开发者快速查找和理解各种语法、函数或方法。 首先,CSS是用于定义网页元素外观和布局的样式语言。`css_cheat_sheet.pdf`可能涵盖了选择器、盒模型、定位、响应式设计、...

    基于Python技术的校园网搜索引擎设计-闫丽丽.pdf

    常见的方法有使用集合(Set)存储已访问过的URL,或者基于URL的哈希值检查。在Scrapy中,可以自定义中间件实现这一功能,确保每个URL只被爬取一次,提高爬虫效率。 4. 防禁止策略 为了避免因频繁请求被目标网站封禁...

    多语言U-S-D-T交易市场源码/U-S-D-T理财系统源码/排单系统源码

    3. **hhhzzz.sql**:这是一个SQL文件,很可能包含了数据库结构、初始数据或者示例数据,用于快速搭建和测试环境。 4. **资源说明(必看).txt**:重要的文本文件,详细解释了压缩包内所有资源的用途和使用方法。 5. ...

    地址连接友情链接网站连接

    每个网页都有一个独一无二的URL,用户可以通过输入这个地址在浏览器中访问相应的网页。地址连接是互联网的基础,使得信息能在全球范围内快速传播。 "友情链接"则是网站之间相互展示对方链接的一种合作方式。它通常...

    Google学术搜索_GoogleScholar_使用方法及技巧

    “intitle:”和“inurl:”可以帮助用户在标题或URL中查找特定的词或短语。“intext:”则用于在正文内容中搜索关键词。 3. 引文追踪:如果用户在搜索结果中点击任意一篇论文旁的“引用”链接,可以查看该论文被引用...

    Django2 By Example中文(1-5)_精排目录

    Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。Django由经验丰富的开发人员制作,它采用了“不要重复自己”(DRY)的设计哲学,使得开发者能够用较少的代码快速完成任务。Django的核心原则...

    搜索引擎原理 爬虫技术

    “爬取”策略是爬虫遍历网页的一种方法,它从一组起始URL开始,按照特定的顺序(如深度优先或广度优先)遍历链接。在这个过程中,爬虫需要维护一个URL集合,以便后续的搜索。搜集到的网页会被存储在知识库中,通常...

    基于Java技术的搜索引擎基本组成和数据结构探究.pdf

    全文检索搜索引擎的数据结构设计中,通常还涉及到倒排索引(Inverted Index)的概念,它是一种索引方法,记录了每个词在文档中的位置,使得从词到文档的检索变得非常快速。倒排索引主要包括词典和倒排文件两部分,...

    Django By Example中文_目录_精排_2017_文字版

    5. QuerySet和Manager:Django的ORM(对象关系映射)提供了一种方法,允许开发者使用Python代码而不是SQL语句来操作数据库。QuerySet是一种特殊的对象,用于从数据库中检索记录集。Manager是为模型提供数据库查询...

Global site tag (gtag.js) - Google Analytics