首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加快HyperLogLog算法的实现

加快HyperLogLog算法的实现
EN

Stack Overflow用户
提问于 2014-05-15 19:03:24
回答 1查看 313关注 0票数 3

我自己实现了HyperLogLog algorithm。它工作得很好,但有时我需要获取大量的HLL结构(大约10k-100 k),并将它们合并。

我将它们存储为位字符串,所以首先必须将每个位字符串转换为桶。因为有很多HLL's,所以比我想的要花更多的时间。

目前,大约80%的运行时为每个HLL接受这一行调用一次的代码:

my @buckets = map { oct '0b'.$_ } unpack('(a5)1024', $bitstring);

有什么办法能更快地做到吗?

如果我们忽略了HyperLogLog的定义,任务可以这样解释:考虑到$bitstring由1024个5位计数器组成(因此每个计数器的值最多可达32),我们必须将其转换为由1024个整数组成的数组。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-15 19:21:58

a表示任意的零填充二进制数据.在这里,您将该数据视为ASCII文本,但它只能包含10!这是低效的,因为a5最终使用了五个字节。最简单和最有效的解决方案是为每个计数器存储一个8位数字,然后是:my @buckets = unpack 'C1024', $bitstring

如果您只想每个计数器存储五位,那么您最终只会为非常麻烦的问题节省很少的内存。你得用这种疯狂的东西来进行往返转换:

代码语言:javascript
复制
my $bitstring = pack "(b5)1024", map { sprintf "%b", $_ } @buckets;
@buckets = map { oct "0b$_" } unpack "(b5)1024", $bitstring;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23686647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档