2015-03-25 2 views
0

Я хотел бы хранить пару миллиардов ключей, пар значений в 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!

ответ

0

MapDB автор здесь.

Первые специализированные сериализаторы ключей/значений. Что-то вроде:

db.createTreeMap("map").keySerializer(BTreeKeySerializer.STRING).makeOrGet(); 

Во-вторых, вы испытываете ошибку производительности в ветке 1.0. Это было решено в версии 2.0, но эта ветвь еще не стабильна.