[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
MapDB
АлексейДата: Воскресенье, 17.03.2019, 02:56 | Сообщение # 1
Продвигающийся
Группа: Администраторы
Сообщений: 324
Награды: 4
Репутация: 1
Статус: Оффлайн
Код
<dependencies>
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>LATEST</version>
</dependency>
</dependencies>
 
АлексейДата: Воскресенье, 17.03.2019, 03:31 | Сообщение # 2
Продвигающийся
Группа: Администраторы
Сообщений: 324
Награды: 4
Репутация: 1
Статус: Оффлайн
Тест на заполнение. Для теста база была заполнена 10 млн. записей
По миллиону за сек:
18872, 29959, 26218, 23609, 25126, 31371, 30759, 31663, 57989, 61013,
Все 10 миллионов:
336581

Код
DB db = DBMaker.fileDB("testread.db")
        .allocateStartSize(1024*1024*1024)
        .allocateIncrement(1024*1024*100)
        .fileMmapEnableIfSupported()
        .fileChannelEnable()
        .checksumStoreEnable().make();

HTreeMap<String,Object[]> map = db.hashMap("testRead", Serializer.STRING, new SerializerArray<Object>(Serializer.JAVA))
        .createOrOpen();

long t1 = System.currentTimeMillis();
for (int j=1;j<11;j++) {
    long t2 = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        map.putIfAbsent("item" + i*j, new Object[]{1, 2, 3, i, System.nanoTime(), System.currentTimeMillis(), new Date().toString()});
    }
    System.out.println(System.currentTimeMillis()-t2);
    db.commit();
}
System.out.println(System.currentTimeMillis()-t1);

db.commit();
db.close();
 
АлексейДата: Воскресенье, 17.03.2019, 03:35 | Сообщение # 3
Продвигающийся
Группа: Администраторы
Сообщений: 324
Награды: 4
Репутация: 1
Статус: Оффлайн
В первой версии с помощью класса Bind можно было создавать дополнительные для своей мапы, чтобы повысить скорость поиска, но тут этого нет. Разработчик либо еще не доделал базу, либо решил убрать данную возможность. Однако существует возможность поиска с помощью префикса:
Код
db.treeMap("",Serializer.BYTE_ARRAY,Serializer.BYTE_ARRAY)
                .createOrOpen().prefixSubMap("item1".getBytes());

        db.treeMap("",Serializer.BYTE_ARRAY,Serializer.BYTE_ARRAY)
                .createOrOpen().subMap("item1".getBytes(),"item2".getBytes());


Однако использование B-дерева в данной базе данных для поиска по префиксу возможно только если известные значения для левой стороны, то есть если вы знаете значение первой части ключа, то вы сможете найти информацию, а если нет, то ничего не получиться. Следующий запрос не сработает, так как неизвестно значение первого поля ключа, что может привести к полному перебору всех записей в базе, так как
        
Код
db.treeMap("",new SerializerArray<Long>(Serializer.LONG),Serializer.BYTE_ARRAY)
                .createOrOpen().prefixSubMap(new Long[] { null, 1L, 2L };);
 
  • Страница 1 из 1
  • 1
Поиск: