【问题标题】:Best library for memory-saving storage of large arrays of char/byte/int? [closed]用于存储大型 char/byte/int 数组的内存节省存储的最佳库? [关闭]
【发布时间】:2013-04-02 08:53:18
【问题描述】:

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

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

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

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

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

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

是否有人知道执行此操作或类似内存效率的库?

【问题讨论】:

    标签: java arrays collections primitive


    【解决方案1】:

    我想我找到了适合我需要的库:http://fastutil.di.unimi.it/ 的 Fastutil 库具有 char、int 等的“BigList”实现,似乎完全按照我想要的方式做我想要的,等等。 Javadoc:http://fastutil.di.unimi.it/docs/

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我考虑过 Trove,但不幸的是,集合大小调整策略是指数级的:每次需要调整大小时,集合大小都会翻倍。对于可能会浪费 50% 堆的非常大的集合来说,这是一个糟糕的策略。
        猜你喜欢
        • 1970-01-01
        • 2015-03-18
        • 2013-10-30
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 2013-05-12
        • 2020-10-14
        • 1970-01-01
        相关资源
        最近更新 更多