Java - 使用动态对象大小缓存HashMap

时间:2015-11-19 09:01:29

标签: java caching hashmap ehcache mapdb

我有一张HashMap地图,其中Node是一个包含一些信息的类,最重要的是包含一个邻居HashMap。

我的算法从外部HashMap中随机获取并放入内部HashMap,例如

Node node = map.get(someInt); 
node.getNeighbors().put(someInt, someOtherInt);

我在外部地图和内部地图中都有很多条目。完整的数据集不能仅由内存处理,因此我需要使用一些磁盘缓存。我想尽可能多地使用内存(直到几乎满,或者直到达到我指定的阈值),然后将条目逐出磁盘。

我已经使用了几个缓存(主要是mapDb和EhCache)试图解决我的问题,但没有运气。我正在设置最大内存大小,但缓存只是忽略它。 我几乎可以肯定,问题在于我的物体具有动态尺寸。

任何人都对如何处理这个问题有任何想法? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

注意:我在Ehcache上工作

与大多数其他缓存产品一样,Ehcache无法了解您的对象大小增长,除非您通过从外部更新映射来了解它:

Node node = cache.get(someInt); 
node.getNeighbors().put(someInt, someOtherInt);
cache.put(someInt, node);

在这种情况下,Ehcache将正确跟踪对象的增长并触发记忆驱逐。

请注意,Ehcache不再在堆和磁盘之间使用溢出模型,而是始终将映射存储在磁盘上,同时在堆上保留hotset。