http://blog.csdn.net/oyd/archive/2007/07/19/1699237.aspx---原网址
我这里介绍一个极适合大量URL快速排重的方法 ,这个算法被称为Bloom filter,基本上,它也只适合这样的场合。
这里的大量是指有5000万至1亿的URL,更大的数据量可能也不合适了。
一开始我使用了一个最复杂的做法,是有一个单独的daemon程序负责排重,数据和排重结果通过socket传输。
后来发现不行,仅仅几百万数据要做好几个小时,5000万不把人都急疯了?至于daemon中具体用什么算法就次要了,因为一涉及到网络通讯,速度再快也被拉下来(这里针对的是发送一条记录/返回一条结果的模式,一次传送一批数据则与网络状况有关了)
所以,把目标锁定在单机排重,一开始,试验了perl中的hash,非常简单的代码
use DB_File;
my %db;
#tie %db, 'DB_File', "createdb.dat", or die "Can't initialize db:: $! ";
while(<>) {
chomp $_;
$db{$_} = 1;# add code here
}
#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的空间,并且排重速度超快,一遍下来不到两分钟,极大得满足了我的欲望。
分享到:
相关推荐
最好是数学或计算机相关专业,编程能力还可以的话,稍微看一下爬虫知识,主要涉及一门语言的爬虫库、html解析、内容存储等,复杂的还需要了解URL排重、模拟登录、验证码识别、多线程、代理、移动端抓取等。...
总结,基于Python的校园网搜索引擎设计利用了Scrapy爬虫框架抓取和处理数据,结合倒排索引技术构建高效检索机制,通过Flask提供用户交互界面,同时考虑了URL去重和防禁止策略以保证爬虫的稳定运行。这种设计能够有效...
配置项包括抓取策略、解析器设置、索引参数等,比如抓取间隔、重试次数、URL过滤规则等。 在实际使用中,理解并调整这些配置文件对于优化Nutch的性能和满足特定需求至关重要。例如,调整抓取频率可以控制抓取速度,...
1、关于重试的消息排重,推荐使用msgid排重。 2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何...
1、关于重试的消息排重,推荐使用msgid排重。 2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何...
队、出队操作,通过统一资源定位符过滤器排重,同时支持基于正则表达式的 统一资源定位符抽取功能。 2.2.6. 套接字(Socket) 发送/接收超文本传输协议请求/响应,发送成功将套接字描述符加入多路I/O, 接收成功抽取...
以及设置重试机制,应对网络不稳定导致的抓取失败。 再者,爬虫需要处理网页编码问题。网页可能采用不同的字符编码,如GBK、UTF-8等,不正确的编码识别会导致乱码。因此,爬虫在解析网页时,需要正确识别并转换编码...
7、采集结果自动排重 8、数据保存到本地,您可以随时查阅信息。 9、信息导入导出随心所欲,可以导出到如Access、Sql server等数据库 11、采集内容测试功能 12、支持自定义发布模块参数 13、强大的内容过滤功能可以...
下载过程需考虑带宽利用率、并发控制、重试机制以及错误处理,以确保高效且稳定的数据获取。 3. 内容解析:下载的网页内容通常包含HTML、CSS、JavaScript等混合内容。Crawler需要解析出纯文本内容,提取出关键词、...
String image_url = cursor.getString(cursor.getColumnIndex(IMAGE_URL)); // ... scenicSpotList.add(scenicSpot); } ``` 在上面的代码中,我们使用了 Java 代码来去掉重复值。我们首先查询数据,然后使用 Java...
在实际应用中,我们需要配置 Nutch 的 **抓取配置**,包括设定爬虫的范围(例如,仅限特定域名)、重试策略、抓取间隔等。此外,还要编写或调整 **解析器**,确保能正确处理不同格式的网页内容。一旦网页被爬取并...
1. 可配置性:Heritrix允许用户通过XML配置文件定义爬取行为,包括URL种子、爬取策略、重试机制等。 2. 异步处理:Heritrix采用事件驱动模型,高效地处理大量HTTP请求。 3. 代理支持:可以设置代理服务器,便于在...
排重功能,避免了重复信息。 11.通过调查用户满意度得出:商剑信息采集软件,至少拥有其它采集软件8倍的功能和性能。 12.客户使用正式版须联系客服QQ:310105089购买,并提供机器码,索取注册码,在商剑官方 网站下载...
这个过程包括了信息的抓取、提取、排重、质量分析,以及信息的存储、排序和快速查询。搜索引擎的"引擎"特性指的是其能处理亿级数据并具有高并发处理能力。 搜索引擎分为两类:传统的PC搜索引擎和移动搜索引擎。后者...
Nutch爬虫的智能在于其能够自动处理各种URL格式,并且具备重试和错误恢复机制,确保数据采集的完整性。 接下来,索引器对抓取的网页进行预处理,包括分词、去除停用词、词干提取等,这些步骤是文本分析的基础。...
URL 判重是避免重复抓取的重要步骤,通常使用哈希法进行判断。常见的开源爬虫项目有 Nutch 和 Heritrix。 【网页分析与信息提取】 正则表达式是网页内容提取的工具,常用于去除无用部分、提取链接、标题和文本。...
- **定制化配置**:针对具体应用场景,调整Nutch的配置参数,如抓取间隔、重试策略等。 优化过程中,需要注意的是,每个改进措施都有其适用场景,盲目优化可能会带来反效果。因此,在实施优化前,建议先进行性能...
这包括了关键词提取、停用词表的使用、句法分析树的构建、相似度计算以及文档排重技术等。例如,通过分析句法结构、计算文本之间的相似度,搜索引擎能够更好地理解用户的查询意图,提供更为准确的搜索结果。 5. ...