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)
有没有有效的方法来做到这一点?
使用 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 对象会使用更多的空间和堆内存。
归档时间: |
|
查看次数: |
1863 次 |
最近记录: |