如何获取Guava的BloomFilter的内存大小
How to get the memory size of Guava's BloomFilter
我找不到直接的 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 过滤器无法轻松做到这一点 API。 (其他库如 FastFilter 具有 getBitCount() 等方法,因此您可以轻松检索它。但是 Guava Bloom 过滤器目前没有这样的方法。)
有一些在线工具可以让您计算 Bloom 过滤器缺少的参数,例如 Bloom Filter Calculator。由于 Guava Bloom filter 是一个常规的 Bloom filter,您可以使用 Bloom filter 的公式(Guava Bloom filter 实现也在内部使用)从参数中自己计算 space 用法:
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 对象会使用更多 space 和堆内存。
我找不到直接的 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 过滤器无法轻松做到这一点 API。 (其他库如 FastFilter 具有 getBitCount() 等方法,因此您可以轻松检索它。但是 Guava Bloom 过滤器目前没有这样的方法。)
有一些在线工具可以让您计算 Bloom 过滤器缺少的参数,例如 Bloom Filter Calculator。由于 Guava Bloom filter 是一个常规的 Bloom filter,您可以使用 Bloom filter 的公式(Guava Bloom filter 实现也在内部使用)从参数中自己计算 space 用法:
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 对象会使用更多 space 和堆内存。