2010-03-10 33 views
10

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

+0

不完全是你可能要搜索的东西,看看Hadoop http://hadoop.apache.org/ – saugata 2010-03-10 05:14:51

+1

是否有一个原因,你没有使用标准的RDBMS呢?从某种角度来看,这是你所问的内容的定义。即使是轻量级的,如h2db,sqlite也可以胜任大多数任务。 – dpb 2010-03-10 05:51:19

回答

4

你可以尝试像ehcache及其overflowToDisk选项

+0

据我所知,Ehcache没有从缓存中轮询(获取+删除)元素的逻辑,根据文档我只看到#get()方法。 也许你知道我该如何使用ehcache实现这样的功能? – MeetJoeBlack 2017-09-07 13:07:48

4

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

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

通过这种方式,99%的磁盘序列化队列已准备就绪,您只需将您的额外功能放在恰当的位置即可。你需要仔细阅读Java的BlockingQueue接口的文档,但是,值得你花时间,因为你只会添加你需要的额外少许功能,而不是从头开始编写整个东西。

希望这会有所帮助。