3

在重新发明可能已经多次发明的任何轮子之前,我正在寻找一个库,它可以让我处理潜在的巨大 char 数组(而不是 Char),同时保持堆开销和不必要的堆分配很小。

这意味着数组实现应该允许

  1. 以 collection.get(long index) 访问元素
  2. 将元素存储为 collection.put(long index, char what) 并在必要时自动分配调整数组大小
  3. 通过我想选择的一些大小的恒定大小块重新调整数组的大小,例如 2^14 个元素。

第 3 点对我的目的很重要:许多实现只是通过分配两倍于当前大小的东西来调整集合的大小,复制并丢弃旧的。如果集合变得非常大并且下一次调整大小操作将需要全部或更多内容,则这很糟糕,尽管堆上仍然可能有足够的空间。

此外,索引类型应该很长,以便可以在数组中存储超过 2^(32-1) 个元素。

因此,如果我要实现这一点,我可能会使用可选择块大小的动态数组。第一级数组将以任何旧方式调整大小(它不会包含太多元素),而第二级数组将始终具有 2^N 的某个固定块大小。

有没有人知道一个库可以做到这一点或类似的内存效率?

4

3 回答 3

1

我想我找到了适合我需要的库:http://fastutil.di.unimi.it/ 上的 Fastutil 库char、int 等的“BigList”实现,这似乎完全符合我想要的方式我想要它,还有更多。Javadoc: http: //fastutil.di.unimi.it/docs/

于 2013-04-02T09:56:46.867 回答
0

如果您需要服务,请尝试使用Voldemort(它是 LinkedIn 项目)的用法类似于从地图中检索(获取和放置)。

您可以配置所需的内存。这会将数据存储在文件系统中(内部使用 bdb)。对于我的测试,它的性能结果与 HashMap 一样好

事实上,任何键值存储都可以使用。我相信Redis也是一个不错的选择。但是我没用过所以不能评论

于 2013-04-02T09:06:44.337 回答
0

如果你想拥有可嵌入的方法,那么我会推荐Trove框架。它快速、轻量级,并且面向原始存储和大量数据。

于 2013-04-02T10:17:45.423 回答