【问题标题】:space optimize a large array with many duplicates空间优化具有许多重复项的大型数组
【发布时间】:2015-10-19 23:48:14
【问题描述】:

我有一个数组,其中索引兼作“项目集合的标识符”,数组的内容是组号。组数落入从 0..N 开始的有限范围,其中 N 1000 但

有没有办法对这个数组进行空间优化,因为整个数组的大小可以达到多个 MB。感谢任何指向相关优化算法/技术的指针。仅供参考:我使用的编程语言是 cpp。

【问题讨论】:

  • 重复值的存在并不自动意味着可以压缩数据。毕竟,您的计算机内存中有几十亿个 1 和 0,但我们无法通过保持规范的 1 和 0 并让每个位指向正确的值或类似的东西来节省任何空间。虽然我们可以通过每个值使用 13 位而不是 16 位来节省空间,但达到 12 位/数据或更低需要利用某种其他类型的数据结构。
  • 嗯...任何数据结构的指针来利用这里的模式?
  • 最有效的技术需要确切了解数据中的模式类型,但是像霍夫曼编码、游程编码和其他压缩技术这样的通用策略可以以访问为代价来节省空间时间。

标签: arrays optimization duplicate-data memory-optimization


【解决方案1】:

您还想要对任意元素进行有效的随机访问吗?或者您是否正在考虑索引-> 组映射的空间高效序列化?

如果您仍然想要高效的随机访问,单个数组查找也不错。最坏的情况是单个缓存未命中。真的,最坏的情况是页面错误,或者更可能是 TLB 未命中,但如果它只有几 MB,则不太可能)。

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

如果重复项至少不能在某种程度上组合在一起,那么您就无能为力了,允许随机访问。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多