【问题标题】:How to get the memory size of Guava's BloomFilter如何获取 Guava 的 BloomFilter 的内存大小
【发布时间】:2019-09-02 03:13:50
【问题描述】:

我无法找到直接 API(即总位数,以字节为单位的内存大小应为 total_bits / 8)。我发现的唯一方法是序列化为字节数组,但这可能会占用更多内存:

    BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.
            stringFunnel(StandardCharsets.UTF_8), 100_000_000);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bloomFilter.writeTo(baos);
    System.out.println(baos.toByteArray().length);

有没有有效的方法来做到这一点?

【问题讨论】:

    标签: guava bloom-filter


    【解决方案1】:

    使用 Guava Bloom 过滤器 API 无法轻松做到这一点。 (其他库如FastFilter 有getBitCount() 等方法,因此您可以轻松检索它。但目前Guava Bloom过滤器没有这样的方法。)

    有一些在线工具可让您计算 Bloom 过滤器的缺失参数,例如 Bloom Filter Calculator。由于 Guava Bloom filter 是一个普通的 Bloom filter,你可以通过参数自己计算空间使用率,使用 Bloom filter 的公式(Guava Bloom filter 实现内部也使用):

    import static java.lang.Math.log;
    import static java.lang.Math.pow;
    
    // expected insertions
    int n = 100_000_000;
    
    // false positive probability; default: 3% for Guava
    double fpp = 0.03;
    
    double bits = n * log(fpp) / -log(pow(2, log(2)));
    int bytes = (int) Math.ceil(bits / 8);
    
    // result for the above: 91230511
    

    这只是一个估计;由于四舍五入,该数字可能会出现偏差。当然,序列化 Java 对象会占用更多空间和堆内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-18
      • 2015-01-14
      • 2017-02-27
      • 2014-08-21
      • 2015-04-28
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多