【问题标题】:Appropriate data structure for storing large number of objects retrievable by sparse identifier存储大量可通过稀疏标识符检索的对象的适当数据结构
【发布时间】:2013-09-04 18:37:17
【问题描述】:

我想我正在寻找一个稀疏数组实现,但我确实需要它在内存使用方面是有效的,并且实现可以利用的我的数据的一个特点是索引的填充使得如果存在索引i 的值,则索引i-1i+1 也可能存在值,类似地,如果i 的值不存在,i-1i+1可能不存在值。

我正在使用 Java,我需要索引类型为 long,而不是更常见的 int,如果这会有所不同的话。我有大约 5000 万个对象需要存储。我查看了 Trove4J 的TLongObjectHashMap,不幸的是,仅哈希表就需要大约 1.6GB,我真的需要改进。

谁能指出我可以针对长期顺序分配的标识符进行优化的方法?插入/获取的对数性能对我来说是可以接受的,所以也许是基于树的?

【问题讨论】:

  • 我对 Trove4J 不熟悉,那 1.6 GiB 的哈希表从何而来?对于 80% 的负载因子和 64 位引用,开放寻址哈希表应适合 915 MiB(5000 万 * 1.2 * (64 + 64) 位)。如果您显式存储所有键和引用(似乎是良好性能所必需的),则信息理论最小值为 5000 万 * (64 + 64) 位 = 762 MiB。
  • 需要哪些操作?什么运行时复杂度?

标签: java data-structures


【解决方案1】:

Btree 的内存开销非常小,所以我会尝试一下。

【讨论】:

  • 我看过了,但没有看到任何对这个问题有用的 BTree 内存实现。您是否有特定的想法,或者您只是建议将其作为一般方法?
  • 仅作为一般方法。这里提到了一些实现:stackoverflow.com/questions/2574661/…(不要使用红黑树,它使用更多的内存)。由于您有 8 字节的密钥,我建议您使用 16-32tree 之类的东西(这样它就可以容纳一行 L2 缓存)。
【解决方案2】:

也许您可以使用数据库而不是数组?像 h2sql 这样的内存嵌入式数据库!

【讨论】:

  • 数据库没有比专用数据结构更小的内存占用(特别是如果数据库自己使用该结构)!
  • 我没有对它进行基准测试,但我怀疑序列化/反序列化开销会给我需要使用这些数据执行的计算增加很大的开销(每个项目都将被随机访问并且可能在此过程中多次),这可能会使完成操作所需的时间增加数小时甚至数天。也就是说,这是我认为最后的手段。你知道 h2sql 是否对超过 4GB 的数据库感到满意吗?
猜你喜欢
  • 2010-11-02
  • 2013-04-09
  • 2010-09-29
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多