如何获取Guava的BloomFilter的内存大小

aun*_*low 4 bloom-filter guava

我无法找到直接的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);
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*ler 5

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

有一些在线工具可让您计算布隆过滤器缺失的参数,例如布隆过滤器计算器。由于 Guava Bloom 过滤器是常规的 Bloom 过滤器,因此您可以使用 Bloom 过滤器的公式(Guava Bloom 过滤器实现内部也使用该公式)根据参数自行计算空间使用情况:

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
Run Code Online (Sandbox Code Playgroud)

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