1

在 redis 中,我们将hyperLogLog视为设置为不同的元素。

众所周知,对于每个键,HLL 仅消耗 12kb 内存,并产生标准误差为 0.81% 的近似值

因为我要计算的元素太多了。所以在这里我想通过将元素存储到多个 hll 键中来降低错误发生率(例如 "hll_key_%d" % (Element mod 1024) )

实际上这是降低错误的有效方法吗?或者任何其他方式来实现?

4

2 回答 2

1

这取决于。如果插入元素的数量明显大于 Redis 实现中的 2^14 的寄存器数量,则可以假设 HyperLogLogs 的错误是正态分布的。如果元素在多个 HyperLogLog 上均等分片,并且每个 HyperLogLog 的元素数仍然大于寄存器数,则通过汇总所有 HyperLogLog 的基数估计得到的总基数估计将具有较小的误差。

原因是 N 个独立且具有均值 M 和标准误差 S 的正态分布数的总和将正态分布,均值 N x M 和标准误差 S x SQRT(N)。因此,相对误差从 S / M 变为 S x SQRT(N) / (N x M) = S / (M x SQRT(N)),这对应于 SQRT(N) 的改进。

但是,这种分片方法不适用于任意数量的 HyperLogLog。一旦部分基数下降到寄存器数量以下,就会违反正态分布误差的假设,估计误差的改善将更小甚至可以忽略不计。

于 2018-07-04T10:05:13.223 回答
0

不,您不能通过将密钥分片到多个 HyperLogLog 中来降低错误。无论使用多少 HyperLogLog,误差始终为 0.81%。

除非您修改源代码,否则无法降低错误。

于 2018-07-03T10:38:16.990 回答