Рекомендовать быструю и масштабируемую постоянную Карту - Java
Мне нужна структура Map на диске для использования в приложении Java. Он должен иметь следующие критерии:
- Способен хранить миллионы записей (даже миллиарды)
- Быстрый поиск - большинство операций на карте просто проверяет, существует ли ключ. Это и 1 выше являются наиболее важными критериями. Должен быть эффективный механизм кэширования памяти для часто используемых ключей.
- Постоянный, но не обязательный для транзакций, может жить с некоторой ошибкой. т.е. с удовольствием периодически синхронизируется с диском, и не нуждается в транзакционности.
- Способен хранить простые примитивные типы - но мне не нужно хранить сериализованные объекты.
- Его не нужно распространять, т.е. все будет работать на одной машине.
- Прост в настройке и бесплатен в использовании.
- Не требуется реляционных запросов
Ключи записей будут строками или длинными. Как описано выше, чтения будут происходить гораздо чаще, чем записи, и большинство операций чтения будут просто проверять, существует ли ключ (т.е. не нужно будет читать данные, связанные с ключами). Каждая запись будет обновлена только один раз, и записи не будут удалены.
В настоящее время я использую Bdb JE, но ищу другие варианты.
Обновить
С тех пор улучшена производительность запросов в моей существующей установке BDB за счет уменьшения зависимости от вторичных ключей. В некоторых запросах требовалось объединение двух вторичных ключей, и, объединив их в составной ключ, я удалил уровень косвенности в поиске, что значительно ускоряет процесс.
9 ответов
Я бы, вероятно, использовал локальную базу данных. Как, скажем, Bdb JE или HSQLDB. Могу я спросить, что не так с этим подходом? У вас должна быть причина искать альтернативы.
В ответ на комментарии: Поскольку проблема производительности, и я думаю, что вы уже используете JDBC для решения этой проблемы, возможно, стоит попробовать HSQLB и прочитать главу об использовании памяти и диска.
JDBM3 делает именно то, что вы ищете. Это библиотека карт на основе дисков с действительно простым API и высокой производительностью.
ОБНОВИТЬ
Этот проект теперь превратился в MapDB http://www.mapdb.org/
Вы можете попробовать Java Chronicles из http://openhft.net/products/chronicle-map/ Chronicle Map - это высокопроизводительное хранилище данных, не зависящее от кучи, с ключом-значением в памяти и постоянным хранилищем данных. Это работает как стандартная карта Java
На сегодняшний день я бы использовал MapDB (файловая / резервная синхронизация или асинхронная синхронизация) или Hazelcast. В последующем вы должны будете реализовать свою собственную устойчивость, т. Е. Опираться на СУБД, реализуя интерфейс Java. Хроника OpenHFT может быть другой вариант. Я не уверен, как постоянство работает там, так как я никогда не использовал его, но утверждаю, что оно есть. OpenHFT полностью вне кучи и позволяет частичное обновление объектов (примитивов) без (де) сериализации, что может повысить производительность.
ПРИМЕЧАНИЕ. Если вам нужен картографический диск из-за проблем с памятью, проще всего использовать MapDB. Hazelcast может использоваться в качестве кэша (распределенного или нет), который позволяет вам извлекать элементы из кучи по истечении времени или размера. OpenHFT не в куче и может быть рассмотрен, если вам нужно только постоянство для перезапусков jvm.
SQLite делает это. Я написал обертку для использования его из Java: http://zentus.com/sqlitejdbc
Как я упоминал в комментарии, я успешно использовал SQLite с гигабайтами данных и таблицами с сотнями миллионов строк. Если вы правильно продумаете индексирование, это очень быстро.
Единственная боль - это интерфейс JDBC. По сравнению с простым HashMap это неуклюже. Я часто заканчиваю тем, что пишу JDBC-обертку для конкретного проекта, которая может добавить много стандартного кода.
Я обнаружил, что Tokyo Cabinet - это простой постоянный хэш / карта, который быстро настраивать и использовать.
Этот сокращенный пример, взятый из документов, показывает, насколько просто сохранять и извлекать данные из постоянной карты:
// create the object
HDB hdb = new HDB();
// open the database
hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT);
// add item
hdb.put("foo", "hop");
hdb.close();
Я думаю, что Hibernate Shards может легко выполнить все ваши требования.
JBoss (дерево) Cache является отличным вариантом. Вы можете использовать его отдельно от JBoss. Очень надежный, производительный и гибкий.