【问题标题】:Probabilistic set for very low probability极低概率的概率集
【发布时间】:2016-10-20 16:55:25
【问题描述】:

我正在寻找一种经过优化的集合数据结构,以使项目成为集合的一部分的可能性非常低。

该用例是 Gnip/Twitter 合规性消防软管,我们每秒收到大约 1,000 个事件(即从所有 Twitter 中删除)。我们有一张表,假设存储了 1000 万条推文(每年以该数量增长),如果某个项目出现在消防软管中,我必须将其删除。我猜每 100,000 秒就会有一场比赛(从空中拉出一个数字)。

我曾想过一个布隆过滤器,可能是几个链式的,但鉴于命中率非常低,我总是需要遍历整个链,事情最终会变得线性。

是否有一个很好的亚线性数据结构?

【问题讨论】:

  • 你试过使用哈希表吗?
  • 哈希表的大小会线性增加,我试图避免这种情况。

标签: data-structures bloom-filter


【解决方案1】:

我没有看到问题。在我看来,如果检查 Bloom 过滤器告诉您已经存储了推文,那么您可以在数据存储中查找该推文。如果它在那里,你删除它。如果不存在,请不要删除它。

您存储了 1000 万条推文,并且您预计它会以每年约 1000 万条的速度增长。所以构建一个容量为 10 亿,误报概率为 0.1% 的布隆过滤器。根据Bloomfilter calculator,这将花费您 1.67 GB。

了解,“误报”数字假定过滤器包含 10 亿个键。当您的过滤器非常稀疏时,误报的概率会低得多。

如果您每秒收到一千条推文,而 Bloom 过滤器的误报率为 0.1%,那么在最坏的情况下,您平均每秒会收到一条误报。因此,您的代码必须每秒访问一次数据库以确定推文是否存在。

但要实现这一目标还需要很多年。现有记录只有 1000 万条,并且以每年 1000 万条的速度增长,过滤器甚至需要 10% 才能填满 10 年。您可能会将过滤器大小降低到 5 亿 (860 MB),但由于误报,您仍然不会注意到很大的影响。

【讨论】:

  • 我没有仔细研究概率;听起来像香草布隆过滤器可以完成这项工作。我只是想检查一下是否有另一种数据结构是为“不可能”的情况设计的。非常感谢您的回答,我试试看。
【解决方案2】:

假设它适合内存,布隆过滤器应该没问题。如果它不能完全放入内存,请考虑使用this paper 中描述的解决方案。

或者,如果你真的想挤出一点额外的性能,你可以使用Cuckoo Filter,但是你会很难找到一个开源的实现;这是Go中的一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多