概率设置为非常低的概率

时间:2016-10-20 16:55:25

标签: data-structures bloom-filter

我正在寻找一种集合数据结构,该结构针对项目是集合的一部分的极低概率进行了优化。

用例是Gnip / Twitter合规性消息,我们每秒获得大约1,000个事件(这是所有Twitter的删除)。我们有一张表,比方说1000万条存储的推文(每年增长一倍),如果一个项目出现在firehose我必须删除它。我猜每10万秒会有一场比赛(从空中拉出一个数字)。

我曾想过一个布隆过滤器,可能有几个链接,但考虑到击中的可能性非常低,我总是需要经历整个链条,事情最终会变得线性。

这是否存在良好的次线性数据结构?

2 个答案:

答案 0 :(得分:0)

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

你有1000万条存储推文,你预计它每年会增长大约1000万条。因此,构建一个容量为十亿的Bloom过滤器,误报概率为0.1%。根据{{​​3}},这将花费你1.67千兆字节。

明白,那是"误报" number假定过滤器包含10亿个密钥。当您的过滤器人口稀少时,误报的可能性要低得多。

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

但是在你达到这个目标之前已经很多年了。现有记录仅有1000万,每年增长速度为1000万,在过滤器甚至达到10%之前还需要10年。您可能会将过滤器大小降低到5亿(860 MB),但仍然没有因为误报而受到重创。

答案 1 :(得分:0)

Bloom Filter应该没问题,假设它适合内存。如果它不能完全适合内存,请考虑使用this paper中描述的解决方案。

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