Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Необходимо кэшировать упорядоченные коллекции, подскажите метод или либу. 
:(
    Опции темы
BegemotX2
Дата 18.9.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 13.11.2005

Репутация: 1
Всего: 1



Есть набор массивов (бооольших.. скажем, по несколько десятков миллинов элементов). Элементы массивов (кроме прочего) имеют дату и упорядочены по неубыванию.
Нужно:
- хранить их в бд
- совершать выборки по идентификатору массива и по диапазону дат
- выборки "сколько элементов с датой <= чем, заданная"
- добавлять/удалять
- изменять элементы, однако эта операция нетипична для этой задачи, в большинстве случаев может изменяться только самый последний элемент в массиве. К тому же, элементы могут иметь одинаковую дату, а, значит, для изменения необходим дополнительный ключ, чего хотелось бы избежать, реализовав операцию изменения через удаление+вставку.

Понятно, что это несложно сделать на уровне базы данных. 

Но элементы необходимо кэшировать. Причем, не по запросам, а по датам.. Ведь "выбрать с 1-янв-2009 по 18-сен-2009" - "выбрать с 2-янв-2009 по 18-сен-2009" и это разные запросы, но общие данные. 

Насколько я знаю, наиболее распространенные релизации кэшей для java (ehcache, oscache, итд) используют модель кэширования по ключу, что неприемлемо, т.к. невыгодно индексировать и искать каждый элемент массива по отдельности.

Для полноты картины: потоков-читателей много, писатель - один.. желательно, чтобы если писатель пишет в один из массив, то читающие из других массивов - не блокировались. Подавляющее большинство (99,99%  smile  ) обновлений - это либо изменение самого последнего элемента в каком-то из массивов, либо дописывание в конец массива.

Подскажите, как эффективно решить такую задачу. Может, существуют специфичные библиотеки... или просто - что бы вы сделали на моем месте?

Это сообщение отредактировал(а) BegemotX2 - 18.9.2009, 17:12
PM MAIL   Вверх
MisterCleric
Дата 18.9.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



Цитата

по несколько десятков миллинов элементов

Сразу говорит о том, что все должно быть в базе... Других вариантов нету. Ты просто сожрешь такими размерами оперативную память и все сдохнет. Да и поиск в такой загруженной памяти не будет эфективным. Не морочь себе голову. Держи все в базе и не парся. 
Если все-таки решишь кешировать, то все равно придется смотреть в сторону движков кешей. У них должен быть механиз для хранения коллекции. Да и все предоставляют механиз так называемых "eviction", т.е. удаление из кеша сущности по истечению какого-то времени. 
Я пользуюсь JBoss Cache
И вот пример его настройки:
Код

<property name="defaultEvictionRegionConfig">
                  <bean class="org.jboss.cache.config.EvictionRegionConfig">
                     <property name="regionName">/</property>
                     <property name="evictionAlgorithmConfig">
                        <bean class="org.jboss.cache.eviction.LRUAlgorithmConfig">

                           <property name="maxNodes">10000</property>

                           <property name="timeToLiveSeconds">1800</property>
                           <property name="minTimeToLiveSeconds">120</property>
                        </bean>
                     </property>
                  </bean>
               </property>

Как видишь максимальное количество содержимого 10000, а не миллионы.
Время жизни после последнего обращения полчаса.
Время перед изгнанием - 2 мин.
Так что думай. 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
BegemotX2
Дата 18.9.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 13.11.2005

Репутация: 1
Всего: 1



MisterCleric, понятно, что все должно быть в базе и что объекты будут временами удаляться. Но кэширование необходимо потому что данные нужны быстро, и реальное использование этих данных такое, что все данные обычно не нужны. Чаще - данные из небольшого количества диапазонов будут многократно читаться разными потоками.
На JBoss Cache посмотрю..
PM MAIL   Вверх
COVD
Дата 18.9.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

либо изменение самого последнего элемента в каком-то из массивов, либо дописывание в конец массива.

Данные текущего дня, которые непрерывно меняются, имеет смысл кешировать. А "исторические" данные (предыдущие дни) брать из базы данных.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0897 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.