在redis中,我们将 hyperLogLog 设置为不同的元素。
众所周知,对于每个密钥,HLL仅占用12kb的内存并产生近似值,标准误为0.81%
因为我有很多要数的元素。所以在这里我想通过将元素存储到多个hll键中来降低错误的发生(例如“ hll_key_%d”%(Element mod 1024))
这实际上是减少错误的有效方法吗? 还是任何其他方式可以实现?
答案 0 :(得分:1)
这取决于。如果插入元素的数量明显大于Redis实现中2 ^ 14的寄存器数量,则可以假设HyperLogLogs的错误是正态分布的。如果元素在多个HyperLogLog上均分,并且每个HyperLogLog的元素数仍大于寄存器数,则通过将所有HyperLogLog的基数估计值相加而获得的总基数估计值将具有较小的误差。
原因是,具有均值M和标准误差S的N个独立且正态分布的数之和将以均值N x M和标准误差S x SQRT(N)呈正态分布。因此,相对误差从S / M变为S x SQRT(N)/(N x M)= S /(M x SQRT(N)),这对应于SQRT(N)的改进。
但是,这种分片方法不适用于任意数量的HyperLogLogs。一旦部分基数下降到寄存器数量以下,就将违反正态分布误差的假设,并且估计误差的改善将变得较小甚至可以忽略。
答案 1 :(得分:0)
否,您无法通过将密钥分片到多个HyperLogLog中来降低错误。无论您使用多少个HyperLogLog,错误始终为0.81%。
除非您修改源代码,否则无法降低错误。