Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Стоит ли оптимизировать кэш основанный на HashMap?


Автор: mgarin 8.11.2010, 13:07
Поясню подробнее...

У меня есть некоторая база объектов (реализация ее для данного вопроса не важна).
Соответственно из нее клиентское приложение получает по ИД объекты, 
и для избежания перенагрузки при постоянном поиске и "доставании" объектов из базы сделан простенький кэш.

Кэш в данном случае - просто некая мапа:
Код
Map<String,MyObject> cache = new HashMap<String,MyObject>();

Соответственно при 1ом получении объекта по ИД он достается из базы и кладется в данную мапу по его ИД (ИД - просто уникальный String).
(Думаю, схема стандартная, но все-таки описал, вдруг и тут есть что-то "неочень")

Теперь о клиентском приложении - он отображает полученные объекты на разных страницах... 
Среднее кол-во страниц может варьироваться от 1 до 50 (больше - маловероятно, но возможно).
Среднее кол-во объектов на странице - от 0 до 1000 (при 1000, впрочем, проекту уже будет писец, так что я бы сказал 500-600 максимум).

Так вот, страницы между собой никак не связаны (как и объекты разных страниц), но все объекты со всех страниц кладутся в единый (тот самый описанный выше) кэш. Т.е. кол-во объектов может варьироваться от 0 до 50000 в кэше.


Теперь, собственно, вопрос:
Стоит ли разделить кэш под каждую страницу отдельно? Или же алгоритмов нахождения элементов в HashMap более чем достаточно для работы на таких размерах?

P.S. Насчет частоты - объекты из кэша могут браться более сотни раз за секунду при отрисовке страницы, т.е. 100 обращений в секунду это вполне нормально.
Может быть и гораздо больше - до 1000-2000, в зависимости от расположения объектов на странице.

Автор: COVD 8.11.2010, 14:04
Цитата

Стоит ли разделить кэш под каждую страницу отдельно? Или же алгоритмов нахождения элементов в HashMap более чем достаточно для работы на таких размерах?

Время доступа к элементам мапа не зависит от его размера, поэтому разбивать мапы только из этих соображений бессмысленно. При больших размерах вместо HashMap'а можно применить кеш-систему (http://ehcache.org/ и др.). В таком кеше редко востребованные элементы автоматически (есть настройки) удаляются из мапа и сохраняются на локальном диске, а при необходимости восстанавливаются. Память используется более рационально ценой незначительного замедления операций (если требуется обращение к диску).

Автор: mgarin 8.11.2010, 15:08
Цитата(COVD @  8.11.2010,  14:04 Найти цитируемый пост)
Время доступа к элементам мапа не зависит от его размера, поэтому разбивать мапы только из этих соображений бессмысленно. При больших размерах вместо HashMap'а можно применить кеш-систему (http://ehcache.org/ и др.). В таком кеше редко востребованные элементы автоматически (есть настройки) удаляются из мапа и сохраняются на локальном диске, а при необходимости восстанавливаются. Память используется более рационально ценой незначительного замедления операций (если требуется обращение к диску). 


Значит, надо пробовать данный инструмент и смотреть будут ли какие изменения

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)