Хэш-карта на основе диска
Есть ли у Java (или есть библиотека), которая позволяет мне иметь HashMap на основе диска? Он не должен быть атомарным или чем-то другим, но к нему будут доступны несколько streamов и не должны вылетать, если два доступа к одному и тому же элементу одновременно.
Кто-нибудь знает что-нибудь?
- Сохранить изображение в папку документов приложений из UIView на IOS
- Как кодировать перечисление с помощью NSCoder в swift?
- Сохранить bitmap в местоположении
- Как сохранить состояние при расширении UIComponentBase
- Правильное использование флеша () в JPA / Hibernate
Файлы свойств или Berkeley DB могут быть тем, что вы ищете. Сам java.util.Properties
реализует java.util.Map
и предоставляет методы для load
и store
в файл. Berkeley DB часто рекомендуется в качестве облегченного хранилища данных с ключом.
MapDB
MapDB предоставляет параллельные TreeMap и HashMap, поддерживаемые дисковым хранилищем или нерабочей памятью. Это быстрый, масштабируемый и простой в использовании встроенный механизм базы данных Java. Он имеет такие функции, как транзакции, пространственную эффективную сериализацию, кеш экземпляра и прозрачное сжатие / шифрование. Он также обладает выдающейся производительностью, конкурирующей только с встроенными встроенными db-двигателями.
jdbm2
Встроенная firebase database Java.
Похоже, вам нужно что-то рядом с легким 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
из коробки.