【问题标题】:Storing many objects using Java使用 Java 存储许多对象
【发布时间】:2011-03-17 19:22:42
【问题描述】:

我正在与这里的社区联系,以了解是否有一种方法可以将许多对象存储在 Java 映射结构 (> 500K) 中。我知道如果我使用 Java Collections API 并且我正在寻找其他解决方案(分布式缓存之外),我的应用程序将在某个时候超出其内存占用。我的意图是存储一些具有 Map> 效果的东西。

要求:

  • 结构将是不可变的(一次加载到地图中)。仅读取权限。
  • 对地图的访问需要相当快,但不是寻找低延迟检索,更关心在内存中存储和保留这些对象。

有没有人知道我可以利用这样一个库来实现这一点,或者有没有人遇到过一种解决方案,他们需要在 Java 中将许多对象加载到内存中?我很想听听您的反馈意见。

谢谢。

【问题讨论】:

  • 您说结构将是不可变的,但添加了“主要读取访问权限”。允许进行哪些修改?
  • 抱歉造成混淆...将“主要”替换为“仅”...将对象添加到地图后不会进行任何写入
  • 从字符串到字符串列表的 500k 映射?是否有任何常见的字符串,即在值之间,或者键也出现在值中?
  • 值之间没有公共字符串...假设它不必是 List 而是 List> ...并且还假设我需要存储500K+ 唯一键。
  • 根据您的值的类型,将它们保持在堆外可能是合适的。在堆中会有一个从字符串到偏移量和长度的映射,它会指向一个内存映射的___Buffer。

标签: java dictionary memory collections


【解决方案1】:

EhCache 非常适合。在最基本的情况下,它提供了一个键值映射,可选的溢出到磁盘,以及可选的 JVM 重启持久性。它会将最常用的元素保存在内存中。

【讨论】:

  • 谢谢,我会看看 EhCache 准系统...我以前使用过 Terracotta,我知道它在内部使用 EhCache...我想避开分布式缓存,但看起来我可以单独使用 EhCache。
【解决方案2】:

我和斯卡夫曼在一起。除了溢出到磁盘之外,EhCache 还允许您将缓存放置在进程内但堆外。如果您的缓存真的很大,这可能会对性能产生非常积极的影响,因为它减少了 GC 的压力。

然而,这个特定的功能必须付费,否则 EhCache 是免费的。

除了 EhCache,Java 中还有一些其他缓存提供类似的,有时甚至更高级的选项,例如 Infinispan 或 OsCache。

【讨论】:

    【解决方案3】:

    您是否考虑过只读数据库,例如 java cdb:http://www.strangegizmo.com/products/sg-cdb/

    【讨论】:

      【解决方案4】:

      H2 数据库引擎的 MVStore 功能

      虽然我没有尝试过,但H2 Database Engine 除了它的关系数据库引擎外,还提供了一个专门的键值存储。这家商店叫MVStore。虽然由 H2 内部使用,但文档建议您可以直接将其用于键值存储。

      MVStore 允许您通过java.util.Map 接口进行交互,而无需使用 JDBC 或 SQL。

      示例用法,取自文档:

      import org.h2.mvstore.*;
      
      // open the store (in-memory if fileName is null)
      MVStore s = MVStore.open(fileName);
      
      // create/get the map named "data"
      MVMap<Integer, String> map = s.openMap("data");
      
      // add and read some data
      map.put(1, "Hello World");
      System.out.println(map.get(1));
      
      // close the store (this will persist changes)
      s.close();
      

      阅读the thorough documentation,了解其性能概况、并发性以及在内存中缓存同时还持久存储到存储中的能力。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-27
        • 2011-08-21
        • 1970-01-01
        • 2020-05-24
        • 2021-11-14
        • 2019-10-30
        • 2016-08-30
        相关资源
        最近更新 更多