0

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

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

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

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

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

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

4

1 回答 1

0

注意:我在 Ehcache 工作

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

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

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

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

于 2015-11-20T09:10:27.393 回答