Почему LMDB работает лучше на ключах, которые уже имеют предыдущие данные? - PullRequest
1 голос
/ 13 апреля 2020

Я работал над системой, использующей LMDB, и наткнулся на некоторые странные характеристики, которые я не понимаю, поэтому я надеюсь, что вы мне поможете.

Я обнаружил, что если бы у меня были какие-то данные; любые данные; данные еще меньшего размера; изначально записанная как значение ключа, база данных будет быстрее и будет иметь меньшую разницу в производительности записи, чем если бы я просто записывал новый ключ и значение одновременно.

Это не имеет большого смысла для меня в данный момент. Я бы подумал, что если ключ, инициализированный данными, которые не имеют одинаковый размер, не будет никакого эффекта. Даже если бы было какое-то преимущество в том, чтобы зарезервировать место для реального значения ключа, этого было бы недостаточно. По-видимому, нет.

Есть ли причина, по которой это может иметь место? Существуют ли какие-либо другие базы данных, демонстрирующие этот тип поведения?

Заранее спасибо за помощь, Майкл

1 Ответ

0 голосов
/ 14 апреля 2020

если бы у меня были какие-то данные; любые данные; данные еще меньшего размера; Первоначально записанная как значение ключа, база данных будет быстрее и будет иметь меньшую разницу в производительности записи

Существует множество факторов, влияющих на воспринимаемую производительность базы данных. Но, чтобы сосредоточиться на наблюдаемом эффекте, подумайте, как LMDB управляет своим магазином. Конечно, вы могли бы взглянуть на код, но часто в реализациях баз данных полезно просто подумать, что бы вы сделали, если бы столкнулись с проблемой разработчика.

Похоже, вы предполагаете, что каждая запись LMDB точно так же велика, как сумма ее ключей и размеров данных. Если бы это было так, то существующие данные меньшего размера заставили бы LMDB выделить новое ... что-то для хранения обновленного значения большего размера. И LMDB должен будет управлять своим хранилищем в соответствии с точным размером каждой записи.

Чтобы избежать этих проблем, ISTR LDMB использует несколько «корзин» памяти фиксированных размеров. Новая запись получает свое размещение из корзины, размер которой соответствует данным. Возможно, ваши тесты имеют достаточно одинаковый размер, чтобы поместиться в одну и ту же корзину, поэтому все, что вы делаете, это перезаписываете одно и то же хранилище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...