如何获取番石榴的BloomFilter的内存大小

时间:2019-09-02 03:13:50

标签: guava bloom-filter

我找不到直接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);

有什么有效的方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:3)

使用Guava Bloom过滤器API很难做到这一点。 (诸如FastFilter之类的其他库都具有诸如getBitCount()之类的方法,因此您可以轻松地检索它。但是Guava Bloom过滤器目前没有这种方法。)

有些在线工具可让您计算Bloom过滤器缺少的参数,例如Bloom Filter Calculator。由于Guava Bloom过滤器是常规的Bloom过滤器,因此您可以使用Bloom过滤器的公式(Guava Bloom过滤器实现也在内部使用)的公式自行计算空间使用量:

import http.client, urllib.request, urllib.parse, urllib.error, base64
import azure.functions as func

headers = {
    # Request headers
    'Content-Type': 'multipart/form-data',
    'Ocp-Apim-Subscription-Key': '{subscription key}',
}

params = urllib.parse.urlencode({
    # Request parameters
    'keys': '{string}',
})

def main(blobin: func.InputStream):
    body = blobin.read()
    try:
        conn = http.client.HTTPSConnection('westus2.api.cognitive.microsoft.com')
        conn.request("POST", "/formrecognizer/v1.0-preview/custom/models/{id}/analyze?%s" % params, body, headers)
        response = conn.getresponse()
        data = response.read()
        print(data)
        conn.close()
    except Exception as e:
        print("[Errno {0}] {1}".format(e.errno, e.strerror))

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