Java将缓存对象写入磁盘

4
我有一堆较大的对象(一个复杂的类,可以被序列化),还有一个运算算法。该算法需要多次对每个对象进行操作,但每次只需要使用其中几个对象。
为了节省内存,如果没有足够的内存,我希望将长时间未使用的对象缓存到磁盘上。算法需要知道哪些对象在磁盘上,以便尽可能地避免使用它们。
如何实现这一点?我是否需要自己实现,或者是否有现成的库可用?
编辑:
由于我会尽快丢弃这些对象,所以我的对象不会超过几百个。每个对象(简化描述)包含一个最多有256x256个元素的二维数组。请考虑主数组的平均负载约为30%,子数组大部分时间都是满的。 数组中的每个对象都包含一些较小的数据:几个向量的数组列表,一个属性HashMap等。我已通过实例化将大部分数据外置,因此数据相当小。

1
在深入讨论之前,我们要谈论多少个对象?它们的类是什么样子的? - JB Nizet
1
大多数缓存API,包括ehcache,支持“最近最少使用”缓存驱逐策略。这将支持您想要实现的目标。 - StvnBrkdll
你为什么相信这会节省内存?你的期望接近操作系统的工作方式。它将内存页面存储在磁盘上,并使用RAM进行性能优化。 - Karol
将它们放入一个大队列中,而不是缓存它们,并让后台任务按顺序完成它们。只要确保它们完成的速度比调用它们的速度快即可! - AntJavaDev
  • AntJavaDev 我已经尝试过将它们排队,但由于算法通常需要一起处理多个对象,所以这种方法行不通。在我效率最高的实现中,对象计数仍然呈线性增长。
- piegames
显示剩余4条评论
1个回答

7
感谢 GitHub 上一个好心的人提到了 MapDB,它非常适合这种用例。它具有基于内存/计数和时间的项目逐出功能。文档中甚至有一个例子(部分“过期溢出”),请参考 这里
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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接