Рекомендовать быструю и масштабируемую постоянную Карту - Java - PullRequest
24 голосов
/ 08 октября 2009

Мне нужна структура Map на диске для использования в приложении Java. Он должен иметь следующие критерии:

  1. Способен хранить миллионы записей (даже миллиарды)
  2. Быстрый поиск - большинство операций на карте просто проверяют, существует ли ключ. Это и 1 выше являются наиболее важными критериями. Должен быть эффективный механизм кэширования памяти для часто используемых ключей.
  3. Постоянно, но не обязательно должно быть транзакционным, может жить с некоторой ошибкой. т. е. периодически синхронизируется с диском и не требует транзакций.
  4. Способен хранить простые примитивные типы, но мне не нужно хранить сериализованные объекты.
  5. Его не нужно распространять, т. Е. Все будет работать на одной машине.
  6. Простота установки и бесплатное использование.
  7. Реляционные запросы не требуются

Ключи записей будут строками или длинными. Как описано выше, чтения будут намного чаще, чем записи, и большинство операций чтения будут просто проверять, существует ли ключ (то есть не нужно читать ключи, связанные с данными). Каждая запись будет обновлена ​​только один раз, и записи не будут удалены.

В настоящее время я использую Bdb JE, но ищу другие варианты.


Обновление

С тех пор улучшена производительность запросов в моей существующей установке BDB за счет уменьшения зависимости от вторичных ключей. В некоторых запросах требовалось объединение двух вторичных ключей, и, объединив их в составной ключ, я удалил уровень косвенности в поиске, что значительно ускоряет процесс.

Ответы [ 9 ]

19 голосов
/ 23 февраля 2012

JDBM3 делает именно то, что вы ищете. Это библиотека карт на основе дисков с действительно простым API и высокой производительностью.

UPDATE

Этот проект теперь превратился в MapDB http://www.mapdb.org

6 голосов
/ 24 ноября 2014

Вы можете попробовать Java Chronicles от http://openhft.net/products/chronicle-map/ Chronicle Map - это высокопроизводительное, сохраняющее в куче ключ-значение в памяти постоянное хранилище данных. Он работает как стандартная карта Java

6 голосов
/ 12 июня 2010

Вы можете посмотреть на OrientDB .

3 голосов
/ 12 марта 2017

На сегодняшний день я бы использовал MapDB (файловая / резервная синхронизация или асинхронная синхронизация) или Hazelcast . В последующем вам придется реализовать свою собственную постоянство, т. Е. Поддерживаемую СУБД путем реализации интерфейса Java. OpenHFT Хроника может быть другой вариант. Я не уверен, как постоянство работает там, так как я никогда не использовал его, но утверждаю, что оно есть. OpenHFT полностью вне кучи и позволяет частичное обновление объектов (примитивов) без (де) сериализации, что может повысить производительность.

ПРИМЕЧАНИЕ. Если вам нужен картографический диск из-за проблем с памятью, самый простой вариант - это MapDB. Hazelcast может использоваться в качестве кэша (распределенного или нет), который позволяет вам извлекать элементы из кучи по истечении времени или размера. OpenHFT находится вне кучи и может быть рассмотрен, если вам требуется только постоянство для перезапусков jvm.

3 голосов
/ 08 октября 2009

Я бы, вероятно, использовал локальную базу данных. Как, скажем, Bdb JE или HSQLDB . Могу я спросить, что не так с этим подходом? У вас должна быть причина искать альтернативы.

В ответ на комментарии: Поскольку проблема производительности, и я полагаю, что вы уже используете JDBC для ее решения, возможно, стоит попробовать HSQLB и прочитать главу Использование памяти и диска .

1 голос
/ 27 сентября 2010

Я обнаружил, Токийский кабинет - это простой постоянный хэш / карта и быстрый в настройке и использовании.

Этот сокращенный пример, взятый из документов , показывает, насколько просто сохранять и извлекать данные из постоянной карты:

    // 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();
1 голос
/ 08 октября 2009

SQLite делает это. Я написал обертку для использования его из Java: http://zentus.com/sqlitejdbc

Как я уже упоминал в комментарии, я успешно использовал SQLite с гигабайтами данных и таблицами из сотен миллионов строк. Если вы правильно продумаете индексирование, оно очень быстрое.

Единственная боль - это интерфейс JDBC. По сравнению с простым HashMap это неуклюже. Я часто заканчиваю тем, что пишу JDBC-обертку для конкретного проекта, которая может добавить много стандартного кода.

0 голосов
/ 08 октября 2009

JBoss (дерево) Cache - отличный вариант. Вы можете использовать его отдельно от JBoss. Очень прочный, производительный и гибкий.

0 голосов
/ 08 октября 2009

Я думаю Осколки гибернации могут легко выполнить все ваши требования.

...