HashMap на основе диска

Есть ли у Java (или есть ли доступная библиотека), которая позволяет мне иметь HashMap на основе диска? Он не обязательно должен быть атомарным или чем-то еще, но доступ к нему будет осуществляться через несколько потоков, и он не должен давать сбой, если два одновременно обращаются к одному и тому же элементу.

Кто-нибудь что-нибудь знает?


person synic    schedule 16.04.2010    source источник
comment
что такое дисковая (хеш) карта?   -  person Progman    schedule 16.04.2010
comment
Файловая система, наверное?   -  person Tomas Andrle    schedule 16.04.2010
comment
@Progman Что-то вроде модуля Python docs.python.org/library/shelve.html#module Модуль -shelve — это то, что я ищу.   -  person synic    schedule 16.04.2010


Ответы (8)


Либо файлы свойств, либо Berkeley DB. Сам java.util.Properties реализует java.util.Map и предоставляет методы для load из и store в файл. Базу данных Berkeley DB часто рекомендуют в качестве облегченного хранилища данных с парами ключ-значение.

person BalusC    schedule 16.04.2010
comment
Я думаю, что свойства будут идеальными. Я не знаю, почему я думал, что должен все усложнить, ха. - person synic; 16.04.2010
comment
Свойства не являются потокобезопасными, что, как вы сказали, вам нужно. Просто представьте, что два потока одновременно записывают файл на диск. Вы можете запрограммировать это или взглянуть на ehcache.org, который при необходимости также обеспечит гораздо лучшую производительность. - person zockman; 17.04.2010
comment
Properties расширяет Hashtable, поэтому он является потокобезопасным, только одновременные чтения синхронизируются, что снижает производительность. - person javaPhobic; 21.04.2017

MapDB

MapDB предоставляет параллельные TreeMap и HashMap, поддерживаемые дисковым хранилищем или памятью вне кучи. Это быстрый, масштабируемый и простой в использовании встроенный механизм базы данных Java. Он содержит такие функции, как транзакции, компактная сериализация, кэш экземпляров и прозрачное сжатие/шифрование. Он также имеет выдающуюся производительность, с которой могут конкурировать только собственные встроенные механизмы db.

http://www.mapdb.org/

jdbm2

Встроенная база данных Java "ключ-значение".

https://code.google.com/p/jdbm2/

person Quartz    schedule 07.03.2013

В 2018 самым легким постоянным key value хранилищем является база данных H2 с ее MVStore:

MVStore — это постоянное, структурированное журналом хранилище ключей и значений. Планируется, что это будет следующая подсистема хранения H2, но ее также можно использовать непосредственно в приложении, без использования JDBC или SQL.

  • MVStore означает «многоверсионный магазин».

  • Каждое хранилище содержит ряд карт, доступ к которым можно получить с помощью интерфейса java.util.Map.

  • Поддерживается как сохранение на основе файлов, так и работа в памяти.

  • Он должен быть быстрым, простым в использовании и небольшим.

  • Поддерживаются одновременные операции чтения и записи.

  • Поддерживаются транзакции (включая параллельные транзакции и двухфазную фиксацию).

  • Инструмент очень модульный. Он поддерживает подключаемые типы данных и сериализацию, подключаемое хранилище (в файл, в память вне кучи), подключаемые реализации карт (B-дерево, R-дерево, параллельное B-дерево в настоящее время), хранилище BLOB и абстракцию файловой системы для поддержка зашифрованных файлов и zip-файлов.

h2-mvstore не имеет зависимостей и версия 1.4.200 представляет собой одну банку размером 0,3 МБ

Я также посмотрел:

  • MapDB (13 meg зависимости)
  • chronicle-map (5.5 meg зависимости - быстрые, опционально распространяемые)
  • lmdbjava (2 meg зависимостей java + lmdb библиотека C) — самая быстрая реализация, но не thread safe из коробки.
person Stuart Cardall    schedule 21.06.2018

Похоже, вам нужно что-то близкое к легкому дб. Рассматривали ли вы Java DB? легкую базу данных с единая индексированная таблица, по сути, представляла бы собой дисковую поточно-ориентированную хеш-карту.

person Paul Sasik    schedule 16.04.2010
comment
В какой-то момент я изучил именно это - фактически перешел от мышления хэш-карты к хэш-карте на основе диска и к БД, которая, по сути, является хэш-картой на основе диска. Было несколько действительно хороших, которые вы можете просто включить в банку и использовать, и это было более 5 лет назад. Здесь хорошо обсуждается база данных: linkedin.com/answers. /технология/разработка программного обеспечения/TCH_SFT/ - person Bill K; 16.04.2010
comment
На самом деле я уже использую sqlite для этой проблемы, но на самом деле все, что мне нужно, это просто хранилище ключей/значений для потоковой передачи. - person synic; 16.04.2010

JDBM2 — это именно то, о чем вы спрашиваете. Он предоставляет HashMap с резервной копией на дисковом хранилище (среди других карт). Он быстрый, потокобезопасный, а API очень простой.

person Andrejs    schedule 23.02.2012
comment
У меня была та же проблема, и JDBM2 идеально подходил для ее решения. Большое спасибо, сэр! - person Pedro Alves; 06.02.2013

Chronicle Map реализует ConcurrentMap и сохраняет данные на диск, сопоставляя память с файл.

Chronicle Map концептуально очень похожа на MapDB (предоставляет аналогичный API-интерфейс конструктора и Map интерфейс), но Chronicle Map раз быстрее, чем MapDB, и имеет гораздо лучший параллелизм (Chronicle Map использует чередующиеся многоуровневые спин-блокировки).

person leventov    schedule 19.03.2017

Project Voldemort также является очень быстрой/масштабируемой/репликационной "хэш-картой". Он используется в LinkedIn, производительность тоже неплохая:

Цитата с их сайта:

Вот пропускная способность, которую мы видим от одного многопоточного клиента, обращающегося к одному серверу, где «горячий» набор данных находится в памяти под искусственно большой нагрузкой в ​​нашей лаборатории производительности:

Чтение: 19 384 запросов в секунду
Запись: 16 559 запросов в секунду

person Alfred    schedule 16.04.2010

Итак, сейчас 2016 год. И если кто-то хочет решить эту проблему, я обнаружил, что API низкоуровневых сред в Xodus от JetBrains работает с той же целью, используя их computeInTransaction лямбда-выражения хранилища.

Конечно, это не так удобно, как наличие чистого экземпляра Map, но в моем случае это сработало.

Другой недавний вариант — использовать механизм хранения MVStore H2, который делает то же самое, но я думаю, он больше ориентирован на саму базу данных.

Ваше здоровье!

person Jesús Zazueta    schedule 11.10.2016