JDBM BTree уже самобалансируется.Он также имеет дефрагментацию, которая очень быстрая и решает все проблемы, описанные выше.
Один узел может храниться в нескольких блоках.Коэффициент ветвления выбирается независимо от размера ключа.Загрузка одного узла может потребовать загрузки нескольких блоков.
Не обязательно.JDBM3 использует отображенную память, поэтому он никогда не считывает полный блок с диска в память.Он создает «представление» поверх блока и считывает только частичные данные по мере необходимости.Таким образом, вместо чтения полного блока 4 КБ, он может читать только 2x128 байтов.Это зависит от размера блока ОС.
Является ли второй подход тем, что обычно используется для ключей переменной длины?или есть какой-то совершенно другой подход, который я пропустил?
Я думаю, вы упустили момент, что увеличение размера диска снижает производительность, так как необходимо читать больше данных.И у одного дерева могут быть общие подходы (сначала вставленные узлы, затем после дефрагментации).
В любом случае, плоский файл с отображенным буфером памяти, вероятно, лучше всего подходит для вашей проблемы.Поскольку у вас фиксированный размер записи и всего несколько миллионов записей.
Также посмотрите на leveldb.Он имеет новый порт Java, который почти превосходит JDBM:
https://github.com/dain/leveldb
http://code.google.com/p/leveldb/