我找不到直接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);
有什么有效的方法可以做到这一点吗?
答案 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对象会使用更多的空间和堆内存。