Хэш-карта на основе диска

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

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

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

MapDB

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

http://www.mapdb.org/

jdbm2

Встроенная firebase database Java.

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

Похоже, вам нужно что-то рядом с легким db. Вы смотрели / считали Java DB? Легкий db с единственной проиндексированной таблицей будет в основном представлять собой карту на основе дисков, основанную на streamах.

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

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

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

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

Читает: 19,384 req / sec
Пишет: 16,559 req / sec

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

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

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

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

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

Ура!

В 2018 самым легким постоянным key value является firebase database H2 с ее MVStore :

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

  • MVStore означает «хранилище с несколькими версиями».

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

  • Поддерживаются как настойчивость на основе файлов, так и внутри памяти.

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

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

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

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

H2 также содержится в одной библиотеке 1.8 meg

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

  • MapDB ( 13 meg зависимостей)
  • хроника-карта ( 5.5 meg зависимостей – быстрая опционально распределенная)
  • lmdbjava ( 2 meg java dependencies + lmdb C library) – самая быстрая реализация, но не lmdb thread safe из коробки.
Давайте будем гением компьютера.