原文地址:http://hi.baidu.com/searchchina/blog/item/5271975975915b2f2934f07a.html
读larbin的源码曾经赞叹它去重方法的设计,虽然有一定的冲突率,但是效率极高,占用的内存非常小,按照larbin的配置,下载6400万网页,使用的内存只有8M。算法特点总结如下:
1、使用hash;
2、将每个url映射到一位;
3、超找的时间是个常数;
4、不处理冲突。
今天偶然看到焦萌的专栏 详细介绍了此算法,也就是有名的Bloom Filter算法,大家可以去看一下,觉得这样的设计真的非常精妙,只要容忍一定的错误率,就可以得到非超高的速度。田春峰也写了一篇《Url排重Bloom Filter 算法、误差及其他》也挺有意思,也可以瞅瞅。
但是可能我们有时无法容忍冲突的发生,这时候采用Bloom Filter显然是不当的。为了不冲突,就必须要保存URL或其对应的唯一值(如MD5),但是面对数以亿计的URL非要把内存“挤爆”不可,那么必须要借助磁盘帮助。在《Design and Implementation of High Performance of Distributed Crawler》一文中有相关的方法,自己英文不好,意思不是很明白,总结了一点,哪位大侠看见错误还望指正。
如何避免larbin当中URL去重的缺陷:数据结构:两个map<url*>, 磁盘维护一个已采集的URL的有序队列;
算法:开始采集到的URL都存入到一个红黑树里面,当红黑树增长到一定程度的时候,转入bulk状态;这时parse 负责将解析出的URL存入另一个红黑树,而且还启动另外一个线程将原红黑树中的数据与磁盘上的有序队列归并,对并过程中实现扫描和插入的操作。每隔一个小时启动一次归并的线程,这样就不会出现larbin中冲突的问题