繁体   English   中英

空间优化具有许多重复项的大型阵列

[英]space optimize a large array with many duplicates

我有一个数组,其中索引兼作“一组项目的标识符”,并且数组的内容是组号。 组号在0..N的有限范围内,其中N << length_of_the_array。 因此,每个条目将被重复很多次。 当前,我必须使用2个字节来表示组号(可以是> 1000但<6500),由于重复的性质,它最终会占用大量内存。

由于整个阵列可以进入多个MB,因此有空间优化该阵列的方法。 感谢任何指向相关优化算法/技术的指标。 仅供参考:im正在使用的编程语言是cpp。

您是否仍然希望对任意元素进行有效的随机访问? 还是在考虑index->​​ group map的节省空间的序列化?

如果您仍然想要高效的随机访问,则单个阵列查找也不错。 最糟糕的是单个缓存未命中。 好吧,真的,最糟糕的是页面错误,或者更可能是TLB丢失,但是如果只有几MB,则不太可能。

可以对经过排序和游程长度编码的列表进行二进制搜索(通过搜索重复计数的前缀和数组),但这仅在您偶尔可以对列表进行排序以使重复项保持在一起的情况下才有效。

如果不能将重复项至少某种程度地组合在一起,那么您将无济于事,无法进行随机访问。

打包的12位条目可能不值得麻烦,除非这样做足以显着减少缓存未命中。 与高速缓存未命中相比,一对用于生成正确地址的乘法指令以及包含所需值的16b负载上的移位和掩码指令没有太多开销。 对打包位域的写访问速度较慢,并且不是原子操作,因此这是一个严重的缺点。 使编译器使用结构打包位域可能是特定于编译器的。 也许只使用char数组是最好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM