我一直听说Bloom Filters如何在网页抓取中发挥作用,尤其是在确定网址是否已经被抓取时(因为Bloom Filter在测试集合成员资格时具有内存效率)。
然而,在网络爬行的使用案例中,鉴于遇到几乎无限数量的URL,位数/存储桶的数量是否需要很大?特别是,如果你是谷歌或搜索引擎试图每天抓取数据。
所以我的问题是,当网址数量持续增加时,Bloom过滤器如何帮助确定网址是否已被抓取,且存储桶数量是否保持不变?
答案 0 :(得分:1)
布隆过滤器基于散列函数,它产生有限的值范围。无论遇到多少URL,每个函数都将返回其范围中的一个值。使用多个散列函数来选择位可以降低误报的可能性,但这始终是可能的。然而,它的概率很小,并且是精确度和效率之间的计算折衷。
网址长度存在实际限制,请参阅this question。当然这是一个惊人的数字。当创建更多URL时,可能需要升级散列函数和存储区大小,但是现在可用的那些能够很好地处理当前可用的URL,并且具有可接受的小错误率。
答案 1 :(得分:1)
对于这个用例,除非有大量的存储桶,否则你将会遇到很大比例的误报(无论如何,几乎不可能完全消除误报,即使对于小应用程序也是如此)。
一个有趣的解决方法是拥有多个级别的布隆过滤器而不是具有平面结构,例如,第一级仅基于域名(例如cnn.com),下一级可能包含扩展网址(例如cnn.com/sports/athletics)。但是当涉及字符串操作和多个哈希函数时,不确定它的执行情况。