用于内存节省大型char / byte / int数组的最佳库?

时间:2013-04-02 08:53:19

标签: java arrays collections primitive

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

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

  1. 以collection.get(长索引)
  2. 的形式访问元素
  3. 将alement存储为collection.put(long index,char what)并在必要时自动分配调整数组的大小
  4. 通过我想要选择的某种尺寸的恒定大小的块来重新调整数组的大小,例如: 2 ^ 14个元素。
  5. 第3点对我的目的来说很重要:许多实现只是通过分配当前大小的两倍来复制大小,复制并丢弃旧的大小。如果集合变得非常大并且下一次调整大小操作需要所有或更多仍然留在堆上,那么这是不好的,尽管堆上仍然可以有足够的数量。

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

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

    是否有人知道这样做的库或类似内存效率的库?

3 个答案:

答案 0 :(得分:1)

我认为我找到了符合我需求的库:http://fastutil.di.unimi.it/的Fastutil库具有char,int等的“BigList”实现,它们似乎按照我想要的方式完成了我想要的工作,并且更多。 Javadoc:http://fastutil.di.unimi.it/docs/

答案 1 :(得分:0)

如果你想要一个服务,那么尝试Voldemort(它是一个LinkedIn项目)的用法类似于从Map中获取(get和put)。

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

实际上可以使用任何Key Value商店。我相信Redis也是一个不错的选择。但我没有使用它,所以无法评论

答案 2 :(得分:0)

如果您想要嵌入式方法,那么我建议使用Trove框架。它速度快,重量轻,面向原始存储和大量数据。