Встраиваемое дисковое хранилище ключей и значений

Мы работаем над проектом, который будет распространяться с использованием одного файла jar. Нам нужно какое-то хранилище ключей со следующими свойствами:

  1. Встраивается в наш файл jar, поэтому не требует дополнительной установки.
  2. Вмещает до десятков миллионов пар
  3. Эффективная память. Это означает менее 100 млн для 50 млн пар.
  4. И ключи, и значения имеют простые типы: long, int, small byte[]
  5. Бесплатная лицензия для коммерческого использования является бонусом
  6. Нам не нужен параллелизм, ACID или подобные продвинутые вещи.
  7. Амортизированное время поиска ниже 100 микросекунд.

Любые предложения, кроме BerkelyDB или JDBM2/3?


person Nikem    schedule 06.01.2012    source источник


Ответы (2)


GNU Trove предлагает несколько карт (например, TIntIntHashMap), которые более эффективно используют память, чем стандартные карты Java, поскольку используют примитивные типы. Я сомневаюсь, что вы можете добиться значительно большей эффективности памяти, если вы не знаете что-то о том, что вы храните. Trove находится под более или менее LGPL, так что, вероятно, вы можете безопасно его использовать. Я не знаю, соответствует ли это конкретно вашим точным спецификациям, но я думаю, что стоит попробовать, когда вы можете уместить вещи в ОЗУ.

Если вам может понадобиться переключиться на диск, хорошим выбором будет Ehcache. Вы можете указать, что после определенного количества записей он будет хранить значения на диске (вновь в версии 2.5 вы можете указать после того, как будет использовано определенное количество оперативной памяти, если вы не знаете точное количество записей).

person Michael McGowan    schedule 06.01.2012
comment
И EhCache... неожиданно :) Я имею в виду, я априори думал, что общие решения для кэширования будут слишком большими накладными расходами. Но... измеряйте, а не угадывайте, так что спасибо, что напомнили мне об этом :) - person Nikem; 09.01.2012

Посмотрите на реализации noSQL, CouchDB, Cassandra и другие довольно хороши.

Поищите в гугле, сравните, найдете то, что хотите.

Мой любимый — mongoDb, и, к сожалению, он не основан на Java.

С Уважением

person Araejay    schedule 06.01.2012
comment
Я понятия не имею, почему решение было отклонено, десятки миллионов строк достижимы с помощью Cassandra, и это не ограничивается оперативной памятью. Вместо Trove (который ломает API после каждого релиза == плохо) и хорошего lusk с синхронизацией в реальном времени, FastUtil на самом деле лучше. Но, что бы ни работало, приятель. - person Araejay; 07.01.2012
comment
Мне не удалось найти встраиваемый noSQL. Все требует отдельной установки. - person Nikem; 09.01.2012