2015-11-19 1 views
0

У меня есть карта HashMap, где Node - это класс, содержащий некоторую информацию и, самое главное, соседей HashMap.Java - Cache HashMap с динамическим размером объекта

Мой алгоритм делает случайные данные из внешнего HashMap и помещает во внутреннюю HashMap, например.

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

У меня есть много записей как на внешней карте, так и на внутренних картах. Полный набор данных не может обрабатываться только с помощью памяти, поэтому мне нужно использовать некоторое кэширование диска. Я хотел бы использовать память как можно больше (до тех пор, пока она не будет полностью заполнена или пока не достигнет порога, который я укажу), а затем вытеснит записи на диск.

Я использовал несколько кешей (в основном mapDb и EhCache), пытаясь решить мою проблему, но не повезло. Я устанавливаю максимальный объем памяти, но кеш просто игнорирует его. Я почти уверен, что проблема кроется в том, что мой объект имеет динамический размер.

У кого-нибудь есть идеи о том, как я мог бы справиться с этой проблемой? Спасибо заранее.

+0

Не могли бы вы дать мне понять, почему EhCache вам не поможет? Выбрасывает ли данные из дискового кэша из памяти? – sphinks

+0

Выселение EhCache, похоже, игнорирует ограничения по размеру. Я работаю с -Xmx1g и устанавливаю размер кеша памяти до 300 Мб, но через некоторое время память заполняется и слишком много активности GC, искажая мое приложение. –

ответ

0

Примечания: Я работаю на Ehcache

Ehcache, как и большинство других кэширования продуктов, не может знать о вашем размере объекта растущего, если вы не дали ему знать, обновляя отображение с внешней стороны:

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

В этот контекст, Ehcache будет правильно отслеживать рост объекта и вытеснить выселение памяти.

Обратите внимание, что Ehcache больше не использует модель переполнения между кучей и диском, но вместо этого всегда сохраняет отображение на диске, сохраняя hotset в куче.

+0

Спасибо за ваш ответ. Я тоже это сделал. Еще не повезло. Я работаю с -Xmx1g и устанавливаю размер кеша памяти до 300 Мб, но через некоторое время память заполняется и слишком много активности GC, искажая мое приложение. Я использую EhCache 2.9 –

+0

Вы взяли свалку памяти? Является ли Ehcache ответственным за деятельность GC или является давлением от вашего приложения? –

+0

Да, я взял кучу кучи через VisualVM. Большинство объектов - это байты [] и char [], и я не использую ни одно из них в своем приложении. Я предполагаю, что это сериализованные версии моих объектов. –