Хэш-карта на основе диска
Есть ли у Java (или есть библиотека), которая позволяет мне иметь HashMap на основе диска? Он не должен быть атомарным или чем-либо, но к нему будут доступны несколько потоков, и он не должен вылетать, если два одновременно обращаются к одному и тому же элементу.
Кто-нибудь знает что-нибудь?
Ответы
Ответ 1
Либо файлы свойств, либо Berkeley DB может быть тем, что ты ищешь. java.util.Properties
сам реализует java.util.Map
и предоставляет методы для load
from и store
в файл. Berkeley DB часто рекомендуется в качестве облегченного хранилища данных с ключом.
Ответ 2
MapDB
MapDB предоставляет параллельные TreeMap и HashMap, поддерживаемые дисковым хранилищем или памятью без памяти. Это быстрый, масштабируемый и простой в использовании встроенный механизм базы данных Java. Он имеет такие функции, как транзакции, пространственную эффективную сериализацию, кеш экземпляра и прозрачное сжатие/шифрование. Он также обладает выдающейся производительностью, конкурирующей только с встроенными встроенными db-двигателями.
http://www.mapdb.org/
jdbm2
Встроенная база данных Java.
https://code.google.com/p/jdbm2/
Ответ 3
Похоже, вам нужно что-то близкое к легкому db. Вы посмотрели/рассмотрели Java DB? Легкий db с одной, проиндексированной таблицей в основном был основан на диске, потокобезопасном хеше карта.
Ответ 4
JDBM2 - именно то, что вы просите. Он предоставляет HashMap, поддерживаемый дисковым хранилищем (среди других карт). Его быстрый, потокобезопасный и API очень прост.
Ответ 5
Проект Voldemort также очень быстрая/масштабируемая/репликация "Hashmap". Он используется в LinkedIn, производительность также очень хороша:
Цитата со своего сайта:
Вот пропускная способность, которую мы видим из один многопоточный клиент, разговаривающий с на одном сервере, где "горячие" данные набор находится в памяти под искусственным большой нагрузки в нашей лаборатории производительности:
Читает: 19,384 req/sec
Пишет: 16,559 req/sec
Ответ 6
Chronicle Map реализует ConcurrentMap
и сохраняет данные на диск путем сопоставления его памяти с файлом.
Chronicle Map концептуально очень похож на MapDB (предоставляет аналогичный API-интерфейс компоновщика и интерфейс Map
), но Chronicle Map раз быстрее, чем MapDB и имеет намного лучшую concurrency (Chronicle Map использует высокополосные многоуровневые блокировки спина).
Ответ 7
Итак, год в 2016 году. И если кто-то хочет решить эту проблему, я обнаружил, что API среды низкого уровня в Xodus от JetBrains работает для этой же цели, используя их computeInTransaction
store lambdas.
Конечно, это не так гладко, как наличие чистого экземпляра Map
, но он работал для моего использования.
Еще один недавний вариант - использовать H2 MVStore
механизм хранения, который делает то же самое, но я думаю, что он более скроен по отношению к самой базе данных.
Ура!
Ответ 8
В 2018
самым легким постоянным key value
является база данных H2 с этим MVStore:
MVStore - это постоянное хранилище значений ключей со структурой журнала. Планируется стать следующей подсистемой хранения H2, но ее также можно использовать непосредственно в приложении, без использования JDBC или SQL.
-
MVStore расшифровывается как "multi-version store".
-
Каждый магазин содержит несколько карт, к которым можно получить доступ с помощью интерфейса java.util.Map.
-
Поддерживаются как постоянство файлов, так и операции в памяти.
-
Он предназначен быть быстрым, простым в использовании и небольшим.
-
Поддерживаются параллельные операции чтения и записи.
-
Поддерживаются транзакции (включая параллельные транзакции и 2-фазную фиксацию).
-
Инструмент очень модульный. Он поддерживает подключаемые типы данных и сериализацию, подключаемое хранилище (в файл, в память вне кучи), реализации подключаемых карт (B-дерево, R-дерево, параллельное B-дерево в настоящее время), хранилище BLOB и абстракция файловой системы для Поддержка зашифрованных файлов и ZIP файлов.
H2
также содержится в одной библиотеке 1.8 meg
Я также посмотрел на:
- MapDB (
13 meg
Мб зависимостей) - Хроническая карта (зависимости от
5.5 meg
- быстрая опция) - lmdbjava (
2 meg
ява зависимостей + lmdb
C библиотека) - быстрая реализация, но не thread safe
из коробки.