【问题标题】:Java collections that spool to disk假脱机到磁盘的 Java 集合
【发布时间】:2010-03-10 05:08:39
【问题描述】:

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

【问题讨论】:

  • 不完全是您可能正在搜索的内容,请查看 Hadoop hadoop.apache.org
  • 您是否有理由不为此使用标准 RDBMS?一方面,它是您所问内容的定义。即使是像 h2db 这样的轻量级的,sqlite 也能胜任大多数任务。

标签: java


【解决方案1】:

你可以试试ehcache 和它的overflowToDisk 选项

【讨论】:

  • 据我所知,Ehcache 没有从缓存中轮询(get+remove)元素的逻辑,根据我只看到 #get() 方法的文档。或许你知道如何使用 ehcache 实现这样的功能?
【解决方案2】:

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

  1. 扩展LinkedBlockingQueue
  2. 覆盖其offerputpolltakeremove 方法。 示例:如果超类'offer 返回 false(达到容量),那么我将开始序列化到磁盘。
  3. 同样,在take 实现中,您检查内存中是否存在任何元素,如果没有,然后您开始从磁盘读取(并删除读取的第一条记录,因为它现在将驻留在内存中;当然,您也可以批量读取记录)。
  4. 为此类队列的每个实例分配一个文件系统安全标识符,以便我可以使用它为其创建文件系统安全文件名。此外,为了更进一步,我可能会使用当前用户的主目录作为将这些队列序列化到磁盘上的位置。

这样,99% 的磁盘序列化队列已准备就绪,您只需将额外的功能放在正确的位置。您需要彻底阅读 Java 的 BlockingQueue 接口的文档,但是,这值得您花时间,因为您只会添加您需要的那一点额外功能,而不是从头开始编写整个东西。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 2022-09-24
    • 1970-01-01
    • 2012-11-21
    • 2021-10-11
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多