Подтвердить что ты не робот

Рекомендовать быстро и масштабируемую постоянную карту - Java

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

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

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

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


Обновление

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

UPDATE

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Я нашел Tokyo Cabinet, чтобы быть простой стойкой Hash/Map, и быстро настроить и использовать.

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

    // 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();

Ответ 8

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

Ответ 9

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