Дисковый HashMap - PullRequest
       11

Дисковый HashMap

32 голосов
/ 16 апреля 2010

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

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

Ответы [ 8 ]

30 голосов
/ 07 марта 2013

MapDB

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

http://www.mapdb.org/

jdbm2

База данных Java Embedded Key Value.

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

11 голосов
/ 16 апреля 2010

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

7 голосов
/ 23 февраля 2012

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

7 голосов
/ 16 апреля 2010

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

4 голосов
/ 19 марта 2017

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

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

4 голосов
/ 16 апреля 2010

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

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

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

Чтение: 19 384 запросов / сек.
Пишет: 16,559 рэк / сек

2 голосов
/ 21 июня 2018

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

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

  • MVStore расшифровывается как «многоверсионный магазин».

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

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

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

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

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

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

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

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

  • MapDB (13 meg зависимости)
  • Хроническая карта (5.5 meg зависимости - быстрое, необязательно распространяемое)
  • lmdbjava (2 meg Java-зависимости + lmdb C библиотека) - самая быстрая реализация, но не thread safe из коробки.
2 голосов
/ 11 октября 2016

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

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

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

Ура!

...