Как в тарантуле точно вычислить размер тапла с индексами?

У меня есть спейс в тарантуле с таплами, состоящими из двух 64-битных чисел: uint64, uint64

Я хочу построить по ним индекс TREE из двух полей:

s:create_index('primary', {unique = true, parts = { {field = 1, type = 'unsigned'}, {field = 2, type = 'unsigned'}} })

В таком спейсе индекс будет занимать значительную часть памяти. Как мне посчитать как можно более точно сколько именно он будет занимать? Есть какая-то формула?


Ответы (1 шт):

Автор решения: The NewOne

Я увидел тут два неодинаковых вопроса.

В таком спейсе индекс будет занимать значительную часть памяти. Как мне посчитать как можно более точно сколько именно он будет занимать? Есть какая-то формула?

Примерно 18 байт на тапл, но не менее 48кБ. Затраты памяти на TREE индекс не зависят о того, по каким полям он построен.

Как в тарантуле точно вычислить размер тапла с индексами?

Индекс по таким полям не будет создавать дополнительных затрат в самом тапле. Поэтому остаются только прямые затраты - заголовок (14 байт) + упакованный msgpack'ом массив в числами + огругление. Ввиду особенностей msgpack, его размер может меняться в зависимости от того, насколько большие числа он хранит, но в данном примере это максимум 19 байт. С округлением 36 байт должно получиться. Это размер самого тапла.

Тарантул хранит таплы отдельно, а индексы отдельно. В сумме будет уходить порядка 36 + 18 = 54 байт на запись.

Вот тут есть подробная информация по затрачиваемой тарантулом памяти.

→ Ссылка