Python 这是布卢姆过滤器的有效/适当使用吗?

Python 这是布卢姆过滤器的有效/适当使用吗?,python,computer-science,bloom-filter,Python,Computer Science,Bloom Filter,我有一个API,数据来自该API,但很多API是冗余的(可以通过id确定)。我有一个bloom过滤器,有几百万个条目要开始 我正在使用来处理实现。 从我的在线阅读: Bloom Filter是一种紧凑的数据结构,用于一组变量的概率表示,以确保集合中的元素肯定存在还是绝对不存在 如果我有这样的伪代码 newData #some dataset for row in newData: #filter.add() returns True if in set, we want only not

我有一个API,数据来自该API,但很多API是冗余的(可以通过id确定)。我有一个bloom过滤器,有几百万个条目要开始

我正在使用来处理实现。 从我的在线阅读:

Bloom Filter是一种紧凑的数据结构,用于一组变量的概率表示,以确保集合中的元素肯定存在还是绝对不存在

如果我有这样的伪代码

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个新条目


这是使用布卢姆过滤器的有效方法吗?

布卢姆过滤器可以对任何给定的元素给出两个答案。它可以说“我肯定我以前从未见过这个元素”或“我相信我以前见过这个元素”。在后一种情况下,可能是布鲁姆过滤器不正确(也就是说,它说“我想我以前见过这个”,而实际上它没有)

也就是说,它所回答的问题不是“我以前从未见过这个”,而是“我想我以前见过这个”(它所见过的元素不可能得到“从未见过”的答案,但在某些情况下,它回答“可能见过”它所没有见过的元素)

这意味着,你唯一可以信赖的100%真实的答案是“从未见过”,但你可能对另一种情况感兴趣,因此你永远不会跳过处理新元素,这并不是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

乔治-你的效率标准是什么?你真的是指适当性/正确性吗?我怀疑布鲁姆过滤器产生的错误对于你的应用来说是错误的。它可能会错误地说,给定的ID以前见过,而它以前没有见过。我认为您更喜欢另一种错误(错误地说一个值没有被看到,当它被看到时),因为这不会使您跳过一个不应该跳过的值(只处理一些您本可以跳过的额外值)。