Проблема
Следуя этому вопросу, кажется, что реализация Map
на основе файлов или дисков может быть правильным решением проблем, о которых я упоминал. Краткая версия:
- Прямо сейчас у меня есть
Map
, реализованный какConcurrentHashMap
. - Записи добавляются к нему постоянно, с довольно фиксированной скоростью. Подробности об этом позже.
- В конце концов, несмотря ни на что, это означает, что JVM заканчивается из кучного пространства.
На работе было (решительно) предложено решить эту проблему с помощью SQLite, но, спросив предыдущий вопрос, я не думаю, что база данных является правильным инструментом для этой работы. Итак - сообщите мне, если это звучит безумно. Я думаю, что лучшим решением будет Map
, хранящийся на диске.
Плохая идея: реализовать это самостоятельно. Лучшая идея: используйте чужую библиотеку! Какой?
Требования
Must-имущих:
- Free.
- Постоянный.. Данные должны храниться между перезапусками JVM.
- Некоторая возможность поиска. Да, мне нужна возможность извлекать эти данные, а также удалять их. Фильтрация базового набора результатов является плюсом.
- Независимо от платформы. Необходимо развертывать продукцию на компьютерах под управлением Windows или Linux.
- Purgeable. Дисковое пространство конечно, подобно кучевому пространству. Мне нужно избавиться от записей, которые
n
дней назад. Это не очень важно, если я должен сделать это вручную.
Ницца к имущим:
- Прост в использовании. Было бы здорово, если бы я смог завершить работу до конца недели.
Еще лучше: конец дня. Было бы действительно, очень здорово, если бы я мог добавить один JAR в мой путь к классам, изменитеnew ConcurrentHashMap<Foo, Bar>();
наnew SomeDiskStoredMap<Foo, Bar>();
и сделать. - Достойная масштабируемость и производительность. Худший случай: новые записи добавляются (в среднем) 3 раза в секунду, каждую секунду, весь день, каждый день. Однако вставки не всегда бывают такими гладкими. Это может быть
(no inserts for an hour)
, затем(insert 10,000 objects at once)
.
Возможные решения
- Ehcache? Я никогда не использовал его раньше. Это было предлагаемое решение по моему предыдущему вопросу.
- Berkeley DB? Опять же, я никогда не использовал его, и я действительно ничего не знаю об этом.
- Hadoop (и какой подпроект)? Не использовал его. Основываясь на этих документах, его кросс-платформенная готовность неоднозначна для меня. Мне не нужна распределенная работа в обозримом будущем.
- A SQLite JDBC-драйвер в конце концов?
- ???
Ehcache и Berkeley DB выглядят разумно прямо сейчас. Какие-либо конкретные рекомендации в любом направлении?