#java #b-tree #map
#java #b-tree #словарь
Вопрос:
Я работаю над проектом, который использует пользовательскую реализацию Map<String, Entry> (где Entry — это пара целых чисел), основанную на B-tree, для хранения от 10 до 100 миллионов записей, код для этого класса медленный и грязный. Мне нужна эффективная реализация карты, которая использует файл для хранения и небольшой объем памяти.
Я поискал и обнаружил, что Java-версия Berkeley DB имеет java.util.API сбора данных (включая Map), но кажется излишним использовать для этой цели полноценную базу данных (она использует каталог со многими файлами, имеет несколько дополнительных потоков для управления). Есть ли более простое решение?
Ответ №1:
Недавно у меня была такая же проблема, и я просмотрел все под солнцем, включая NoSQL и кэши. Вам нужна хэш-карта на основе диска / файла / с резервной копией.
Berkeley DB Java Edition, безусловно, лучшая. Она быстрая, масштабируемая и полная, но вы не можете распространять ее среди клиентов, не распространяя свой исходный код или не покупая коммерческую версию у Oracle.
Единственным другим вариантом, помимо изобретения колеса, является JDBM2. В нем также есть хэш-карта и древовидная карта. Вы несете ответственность за регулярную загрузку на диск для предотвращения OutOfMemoryError, и это не так быстро, как Berkeley DB, но это очень хороший второй вариант.
Ответ №2:
Взгляните на Kyoto Cabininet, реализацию DBM с поддержкой диска. Я использовал предыдущую версию, Tokyo Cabinet — она была очень проста в использовании, в основном как нативная Map
, и очень быстрая.
Комментарии:
1. Это приятно, но не предоставляет java.util. Интерфейс карты (у меня есть много кода, который предполагает интерфейс карты).
2. Создание пользовательской
Map
оболочки для объекта базы данных Kyoto Cabinet займет несколько минут.
Ответ №3:
JDBM — это облегченная, чисто Java B-Tree реализация.