![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
BegemotX2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 13.11.2005 Репутация: 1 Всего: 1 |
Есть набор массивов (бооольших.. скажем, по несколько десятков миллинов элементов). Элементы массивов (кроме прочего) имеют дату и упорядочены по неубыванию.
Нужно: - хранить их в бд - совершать выборки по идентификатору массива и по диапазону дат - выборки "сколько элементов с датой <= чем, заданная" - добавлять/удалять - изменять элементы, однако эта операция нетипична для этой задачи, в большинстве случаев может изменяться только самый последний элемент в массиве. К тому же, элементы могут иметь одинаковую дату, а, значит, для изменения необходим дополнительный ключ, чего хотелось бы избежать, реализовав операцию изменения через удаление+вставку. Понятно, что это несложно сделать на уровне базы данных. Но элементы необходимо кэшировать. Причем, не по запросам, а по датам.. Ведь "выбрать с 1-янв-2009 по 18-сен-2009" - "выбрать с 2-янв-2009 по 18-сен-2009" и это разные запросы, но общие данные. Насколько я знаю, наиболее распространенные релизации кэшей для java (ehcache, oscache, итд) используют модель кэширования по ключу, что неприемлемо, т.к. невыгодно индексировать и искать каждый элемент массива по отдельности. Для полноты картины: потоков-читателей много, писатель - один.. желательно, чтобы если писатель пишет в один из массив, то читающие из других массивов - не блокировались. Подавляющее большинство (99,99% ![]() Подскажите, как эффективно решить такую задачу. Может, существуют специфичные библиотеки... или просто - что бы вы сделали на моем месте? Это сообщение отредактировал(а) BegemotX2 - 18.9.2009, 17:12 |
|||
|
||||
MisterCleric |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1043 Регистрация: 16.2.2006 Где: Харьков, Украина Репутация: 5 Всего: 38 |
Сразу говорит о том, что все должно быть в базе... Других вариантов нету. Ты просто сожрешь такими размерами оперативную память и все сдохнет. Да и поиск в такой загруженной памяти не будет эфективным. Не морочь себе голову. Держи все в базе и не парся. Если все-таки решишь кешировать, то все равно придется смотреть в сторону движков кешей. У них должен быть механиз для хранения коллекции. Да и все предоставляют механиз так называемых "eviction", т.е. удаление из кеша сущности по истечению какого-то времени. Я пользуюсь JBoss Cache И вот пример его настройки:
Как видишь максимальное количество содержимого 10000, а не миллионы. Время жизни после последнего обращения полчаса. Время перед изгнанием - 2 мин. Так что думай. -------------------- ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ... |
||||
|
|||||
BegemotX2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 13.11.2005 Репутация: 1 Всего: 1 |
MisterCleric, понятно, что все должно быть в базе и что объекты будут временами удаляться. Но кэширование необходимо потому что данные нужны быстро, и реальное использование этих данных такое, что все данные обычно не нужны. Чаще - данные из небольшого количества диапазонов будут многократно читаться разными потоками.
На JBoss Cache посмотрю.. |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Данные текущего дня, которые непрерывно меняются, имеет смысл кешировать. А "исторические" данные (предыдущие дни) брать из базы данных. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |