スレッドセーフなBloomFilter実装、つまり、値が順番に、または同時に並列にフィルターに入れられた場合にまったく同じように動作する実装を探しています。guavaのBloomFilterのjavadocは、スレッドセーフについては言及していません。スレッドセーフですか?
5 に答える
GuavaBloomFilter
はスレッドセーフではありません。
そうは言っても、スレッドセーフに期待するセマンティクスが100%明確ではありませんBloomFilter
-put
アトミックですか?私は the を に置き換えた場合の効果を想像していlong[]
ます。最終的に得られるセマンティクスは「if occur-beforeの場合は を返します」AtomicLongArray
であると確信しています。これらのセマンティクスは有用だと思いますが、私は肯定的ではありません。put(x)
mightContain(x)
mightContain(x)
true
これは、特定のユースケースで問題を報告する価値があるかもしれませんが、ここでスレッドセーフが正確に何を意味するかについて解決するための詳細がいくつかあります.
先週、この問題が発生しました。
グアバブルームフィルターのラッパークラスを作成することになり、そこでいくつかのフィルターを作成しました。次に、挿入するキーに応じて、フィルターの 1 つを選択し、それだけで同期しました。256 個のフィルターと 8 個の同時スレッドで実行すると、同期が追加されたにもかかわらず、90% の CPU 使用率に達しました。
このプロパティを内部的に必要としたため、並行更新をサポートするために Apache Cassandra バージョンを採用しました。ここで確認できます: https://github.com/ifesdjeen/blomstre