我有一个API来自哪个数据,但很多都是冗余的(可以从id中确定)。我有一个带有几百万个条目的Bloom过滤器。
我正在使用this library来处理实施。 从我在线阅读:
Bloom Filter是一个紧凑的数据结构,用于对一组变量进行概率表示,以确保集合中的元素是否确实存在,或者肯定不存在于集合中。 Source
如果我有这样的伪代码
newData #some dataset
for row in newData:
#filter.add() returns True if in set, we want only not in set
if not filter.add(row.id):
#do some stuff with fresh data
每次进入一组数据时都会调用此函数,大约200个新条目/秒。
这是使用bloom过滤器的有效方法吗?
答案 0 :(得分:0)
对于任何给定元素,Bloom过滤器可以给出两个答案。它可以说"我绝对相信我以前从未见过这个元素"或者"我相信我在"之前看过这个元素。在后一种情况下,可能是Bloom过滤器不正确(也就是说,它说'#34;我想我之前已经看过这个"事实上,它已经没有' ; t)的
也就是说,它回答的问题不是"我以前从未见过这个问题"但是"我想我之前已经看过这个" (它没有看到它所见到的元素会得到答案"从未见过",但可能会有这样的情况:它可能会回答"可能已经看过"对于它没有的元素' ;见过)。
这意味着你可以依靠100%真实的唯一答案是#34;从未见过",但你可能对另一种情况感兴趣,所以你永远不会跳过处理新的元素和这并不是Bloom过滤器为您提供的保证。
如果处理成本很高,您可以使用Bloom过滤器作为更昂贵的缓存查找的门。
伪代码:
if not bloom.seen(element):
# we have never seen this
bloom.add(element)
value = process(element)
more_expensive_cache.set(element, value)
return value
else:
value, seen = more_expensive_cache.lookup(element)
if not seen:
value = process(element)
more_expensive_cache.set(element, value)
return value