Google Guava's Bloom Filterが私のプロジェクトで動作するかどうかを判断しようとしていますが、私のテストでは、誤検出率が非常に高くなっています(おそらく高レベルのハッシュ衝突のためでしょうか?グアバブルームフィルタの性能が悪いのはなぜですか?
2つのデータファイルを使用して実験を行っています。最初のものは、私がブルームフィルターに入れた2200万の固有の数値(整数)を含んでいます。 2つ目は、Bloom Filterで偽陽性をテストするために使用する、まったく異なる数の別のセットも含まれています。
これは、これらの数字の一部がどのように見えるかの例です:
1010061
904436
859990
854448
839175
754186
904491
233955
904491
876342
919575
603051
1012863
989713
323424
私のコードは以下の通りです:
private static void experiment() {
// Load 22m unique IDs from file
ArrayList<String> skus = loadSkus("sku_1.txt");
int numInsertions = skus.size();
// Google Guava Bloom Filter
Funnel<String> strFunnel = (Funnel<String>) (from, into) -> into.putString(from, Charset.forName("US-ASCII"));
BloomFilter<String> bf = BloomFilter.create(strFunnel, numInsertions, 0.001);
for (String sku : skus) {
bf.put(sku);
}
int falsePositiveCount = 0;
double falsePositiveRate;
// Load another set of unique IDs that are NOT in the first set
ArrayList<String> skus2 = loadSkus("sku_2.txt");
for (String sku : skus2) {
if (bf.mightContain(sku)) {
falsePositiveCount++;
}
}
falsePositiveRate = (double)falsePositiveCount/(double)skus2.size();
System.out.println("Expected FPP: " + Double.toString(bf.expectedFpp()));
System.out.println("Measured FP rate: " + Double.toString(falsePositiveRate));
}
結果:
Expected FPP: 7.276343403395039E-27
Measured FP rate: 0.9979594547309587
測定率偽陽性の数は信じられないほど高いようです!これは、このデータ構造がどのように振舞うべきかではありません。ライブラリを何らかの方法で悪用していますか?私は本当にBloom Filterで適切なパフォーマンスを達成したいと思います。
をはいああ、あなたは正しいです。誤って重複を含むデータファイルに問題がありました。ご協力いただきありがとうございます。 – tcfritchman