【问题标题】:Java cache objects to diskJava 缓存对象到磁盘
【发布时间】:2016-11-20 14:26:15
【问题描述】:

我有一组相当大的对象(一个复杂的类,可以被序列化)和一个对其进行操作的算法。该算法必须对每个对象多次工作,并且一次只需要集合中的几个对象。

为了节省 RAM,如果内存不足,我想将算法暂时未使用的对象缓存到磁盘。该算法需要知道哪些对象在磁盘上,以便尽可能长时间地避开它们。

我如何实现这一目标?我必须自己实现还是有现有的库?

编辑:

我可能不会拥有超过几百个这样的对象,因为我会尽快丢弃它们。每个对象(简化描述)包含一个二维数组,最多包含 256x256 个元素。考虑主阵列的平均负载约为 30%,而子阵列大部分时间几乎已满。数组中的每个对象都包含一些较小的数据:一些带有向量的数组列表、一个属性 HashMap 等等。我通过实例化外包了大部分数据,因此它相当小。

【问题讨论】:

  • 在进入这个之前,我们在谈论多少个对象?他们的班级是什么样的?
  • Apache commons 有一个缓存库:commons.apache.org/dormant/cache
  • 大多数缓存 API,包括 ehcache,都支持“最近最少使用”的缓存弹出策略。这将支持您要完成的工作。
  • 你为什么相信它会节省内存?您的期望与操作系统的工作方式接近。它将内存页面存储在磁盘上并使用 RAM 进行性能优化。

标签: java caching serialization


【解决方案1】:

感谢 GitHub 上的一个好人,他提到了 MapDB,它非常适合用例。它具有内存/计数和基于时间的项目驱逐。文档甚至has an example(“过期溢出”部分):

DB dbDisk = DBMaker
        .fileDB(file)
        .make();

DB dbMemory = DBMaker
        .memoryDB()
        .make();

// Big map populated with data expired from cache
HTreeMap onDisk = dbDisk
        .hashMap("onDisk")
        .create();

// fast in-memory collection with limited size
HTreeMap inMemory = dbMemory
        .hashMap("inMemory")
        .expireAfterGet(1, TimeUnit.SECONDS)
        //this registers overflow to `onDisk`
        .expireOverflow(onDisk)
        //good idea is to enable background expiration
        .expireExecutor(Executors.newScheduledThreadPool(2))
        .create();

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多