假脱机到磁盘的Java集合

假脱机到磁盘的Java集合,java,Java,在Java中,由于在事务过程中建立了一些非常大的列表和设置,并且在事务结束时只迭代了一次,所以我的内存不足。是否有提供Java集合的库可以在集合大小超过给定阈值时将其可序列化内容假脱机到磁盘?您可以尝试类似的方法及其overflowToDisk选项我不会向您发布示例代码,因为它会变得太长,但我以前就是这样做的: 扩展LinkedBlockingQueue 覆盖其提供,放置,轮询,获取和删除方法。示例:如果超类“offer返回false(已达到容量),则我将开始序列化到磁盘 同样,在take实现中

在Java中,由于在事务过程中建立了一些非常大的列表和设置,并且在事务结束时只迭代了一次,所以我的内存不足。是否有提供Java集合的库可以在集合大小超过给定阈值时将其可序列化内容假脱机到磁盘?

您可以尝试类似的方法及其overflowToDisk选项

我不会向您发布示例代码,因为它会变得太长,但我以前就是这样做的:

  • 扩展
    LinkedBlockingQueue
  • 覆盖其
    提供
    放置
    轮询
    获取
    删除
    方法。示例:如果超类“
    offer
    返回false(已达到容量),则我将开始序列化到磁盘
  • 同样,在
    take
    实现中,检查内存中是否存在任何元素,如果没有,则开始从磁盘读取(并删除读取的第一条记录,因为它现在将驻留在内存中;当然,也可以批量读取记录)
  • 为这样一个队列的每个实例分配一个文件系统安全标识符,以便我可以使用它为其创建文件系统安全的文件名。此外,为了更进一步,我可能会使用当前用户的主目录作为将这些队列序列化到磁盘上的位置
  • 这样,99%的磁盘序列化队列已经就绪,您只需将额外的功能放在正确的位置。您需要彻底阅读Java的
    BlockingQueue
    接口的文档,但这是值得的,因为您只需要添加所需的一点点额外功能,而不是从头开始编写整个过程


    希望这能有所帮助。

    这与您可能要搜索的不完全一样,请看一看Hadoop。您不使用标准RDBMS来实现这一点有什么原因吗?一方面,这是对你所问问题的定义。即使是像h2db这样的轻量级工具,sqlite也可以完成大多数任务。据我所知,Ehcache没有从缓存中轮询(get+remove)元素的逻辑,根据我只看到的#get()方法的文档。也许您知道如何使用ehcache实现这些功能?