我自己实现了HyperLogLog algorithm
. 它工作得很好,但有时我必须获取很多(大约 10k-100k)的 HLL 结构并将它们合并。
我将它们中的每一个都存储为一个位字符串,所以首先我必须将每个位字符串转换为存储桶。由于有很多 HLL,它需要的时间比我想要的要多。
目前,大约 80% 的运行时会为每个 HLL 调用一次这行代码:
my @buckets = map { oct '0b'.$_ } unpack('(a5)1024', $bitstring);
有什么方法可以更快地做到这一点?
如果我们将 HyperLogLog 的定义抛在脑后,任务可以这样解释:假设它$bitstring
由 1024 个 5 位计数器组成(因此每个计数器的值最高可达 32),我们必须将其转换为 1024 个整数的数组。