Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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 из коробки.