Java缓存对象到磁盘

时间:2016-11-20 14:26:16

标签: java caching serialization

我有一个相当大的对象集合(一个复杂的类,可以进行序列化)和一个在其上运行的算法。该算法必须多次处理每个对象,并且一次只需要集合中的一些对象。

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

我如何实现这一目标?我必须自己实现这个或者是否有现有的库?

修改

我可能不会因为我尽快丢弃这些物品而赢得超过几百个物品。每个对象(简化描述)包含一个最多256x256个元素的2D数组。考虑主阵列的平均负载约为30%,子阵列在大多数时间几乎都是满的。数组中的每个对象都包含一些较小的数据:一些包含向量的数组列表,一个属性HashMap等。我将大部分数据外包给实例,因此它很小。

1 个答案:

答案 0 :(得分:3)

感谢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();