【问题标题】:Why is Guava Bloom Filter Performing so Poorly?为什么番石榴布隆过滤器表现如此糟糕?
【发布时间】:2016-11-02 19:10:05
【问题描述】:

我正在尝试确定Google Guava's Bloom Filter 是否适用于我的项目,但是在我的测试中,我得到了极高的误报率(可能是由于高水平的哈希冲突?)。

我正在使用 2 个数据文件运行实验。第一个包含我放入布隆过滤器的 2200 万个唯一数字(整数)。第二个包含另一组完全不同的数字,也是唯一的,我用它来测试布隆过滤器的误报。

这是其中一些数字的示例:

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 获得适当的性能。

【问题讨论】:

    标签: java hash guava bloom-filter


    【解决方案1】:

    我无法重现您的结果。我唯一能想到的是它与您的数据文件有关?

    我使用了与您发布的代码相同的代码,只是我生成了如下所示的 sku:

    final List<String> skus = ContiguousSet.create(Range.closedOpen(0, 22000000), DiscreteDomain.integers()).stream().map(String::valueOf).collect(Collectors.toList());
    

    final List<String> skus2 = ContiguousSet.create(Range.closedOpen(-22000000, 0), DiscreteDomain.integers()).stream().map(String::valueOf).collect(Collectors.toList());
    

    结果:

    Expected FPP:     0.0010001451412535098
    Measured FP rate: 9.963636363636364E-4
    

    【讨论】:

    • 啊,是的,你是对的。错误地包含重复的数据文件存在问题。感谢您的帮助。
    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多