这是布隆过滤器的有效/适当使​​用吗?

时间:2016-01-16 01:49:01

标签: python computer-science bloom-filter

我有一个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过滤器的有效方法吗?

1 个答案:

答案 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