线程安全的bloomfilter

问题描述 投票:3回答:5

我正在寻找一个线程安全的BloomFilter实现,即如果值按顺序放入过滤器或同时并行放置,则实现的行为完全相同。 guava的BloomFilter的javadoc对线程安全性保持沉默。它是线程安全的吗?

java guava
5个回答
2
投票

番石榴的BloomFilter不是线程安全的。

也就是说,对于我来说,对于一个线程安全的BloomFilter你会期望什么语义不是100%清楚 - put会原子化吗?我想象用long[]替换AtomicLongArray的效果,我很确定你最终的语义是“如果put(x)发生 - 在mightContain(x)之前,然后mightContain(x)返回true”,我认为那些语义是有用的,但我认为我不是积极的。

这可能值得filing an issue具有特定的用例,但是有一些细节可以确定线程安全在这里的含义。


0
投票

正如其他人所指出的那样,最好的解决方案是修补现有框架以使其具有线程安全性。但是为了更直接的需求,考虑将非线程安全版本包装在线程安全的外观中:

public class ThreadSafeBloomFilter {
  private BloomFilter filter;

  public ThreadSafeBloomFilter(BloomFilter filter) {
    this.filter = filter;
  }

  public synchronized void add(Object obj) {
    filter.add(obj);
  }
}

以类似的方式实现您需要的其他方法。你可能也想让它变得更好和通用(比如ThreadSafeBloomFilter,但那是你的调用)。

在性能方面,这将序列化所有请求,因此您不会通过并行访问来获得任何性能提升(并且可能会产生瓶颈)。


0
投票

上周我遇到了这个问题。

结束为番石榴布隆过滤器创建包装类,在那里我创建了许多过滤器。然后根据插入的键我选择了一个过滤器并单独同步。使用256个过滤器和8个并发线程运行,即使增加了同步,我也达到了90%的CPU利用率。


0
投票

我采用了Apache Cassandra版本来支持并发更新,因为我们在内部需要这个属性。你可以在这里查看:https://github.com/ifesdjeen/blomstre


0
投票

我用不同的bloom过滤器创建了java库,它们都是线程安全的。看看这个。 ponkin/bloom

© www.soinside.com 2019 - 2024. All rights reserved.