Я хотел бы хранить пару миллиардов ключей, пар значений в MapDB. У меня специфические требования:MapDB фиксированная структура ключа и значение
ключ = длинные (8 байт) значения = максимум 5 записей из (UUID + от современного + актуального), так что 5 * 32 байт = 160
Требования, чтобы иметь однопоточное приложение: загрузка по ключу и изменение одной из дат в записях. Размер значения не изменится.
Интересно, какая самая эффективная установка - это делать и ставит. Я получаю производительность, предварительно распределяя массив байтов 160 и использую это как значение? Или это не имеет значения, и просто используйте массив байтов, гибкий по размеру?
В настоящее время у меня есть
DB db = DBMaker
.newFileDB(dbFile)
.asyncWriteEnable()
.asyncWriteFlushDelay(100)
.transactionDisable()
.make();
насоса:
BTreeKeySerializer keySerializer = BTreeKeySerializer.ZERO_OR_POSITIVE_LONG;
Map<Long, Item> map = db.createTreeMap("map")
.pumpSource(source)
.keySerializer(keySerializer)
.make();
где источник
Iterator<Fun.Tuple2<Long, byte[]>> source = new Iterator<Fun.Tuple2<Long, byte[]>>()
Загрузка
Map<Long, byte[]> map = db.<Long, byte[]>getTreeMap("map");
После использования карты данных, чтобы загрузить карту с 20 000 000 предметов (производительность ухудшается с течением времени), поиск немного разочаровывает:
200 000 поисковых запросов в 199,999 мс. (Около 1000/второй)
взгляда вверх резко возрастает после запуска моего теста приложение во второй раз:
200000 поиски в 7,597 мс.
Есть ли что-нибудь, что я могу сделать, чтобы улучшить производительность, учитывая требования к фиксированным размерам ключей/значений? Любые опции, которые я могу включить?
Я использовал TreeMap, потому что у него есть насос данных. Будет ли производительность значительно возрастать при использовании HashMap?
Cheers!