Size: a a a

2021 February 10

DV

Dmitry V in Tarantool
Всем привет. Попробовал один и тот же датасет загрузить в rocksdb и в vinyl, в итоге винил занимает почти в 2 раза больше места на диске чем rocks. Compression и compaction  в rocks установил аналогичные vinyl, leveled compaction и zstd 3 compression. Это ожидаемое поведение? Есть ли какие нибудь настройки для оптимизации занимаемого места на диске?
источник

M

MAPC in Tarantool
Арефьев Дмитрий
А не проще ли будет через crud?
и в какой бакет все в итоге попадет ?
источник

АД

Арефьев Дмитрий... in Tarantool
MAPC
и в какой бакет все в итоге попадет ?
В тех приложениях которые я писал это все уходит на откуп crud.  Данные равномерно размазываются по шарду
источник

MA

Mons Anderson in Tarantool
Dmitry Krokhin
а такая помощь только счастливчикам? у нас тоже беда с новыми 2.* релизами. для 7мб итемов - 720мб арены и оно бесконечно растёт, а потом ругается что не может аллоцировать память.

сейчас используем 2.6.2-0-g34d504d7d.
вывод скрипта: https://pastebin.com/W4U0RN4a
А у вас та же самая проблема )
Попробуйте тот же самый рецепт, только вам я поставил бы нижнюю границу меньше:
memtx_min_tuple_size = 8,
slab_alloc_factor = 2,

у вас данные заканчиваются до 256 байт. 8 я получил как 256-31*8.
т.о. будут слабы 8, 16, 24, ... 256, а потом увеличением x2: 512, 1024, 2048, ...
источник

MA

Mons Anderson in Tarantool
MAPC
Подскажите, пожалуйста, как действовать в случае, когда на вставку приходит набор записей, например 1000, и бакет вычисляется по идентификатору этих записей, как передать
vshard.router.call
весь набор записей с посчитанными бакетами ?
Или только в цикле дергать ?
vshard.router.call(100,
                  'write',
                  'customer_add',
                  {{customer_id = 2, bucket_id = 100, name = 'name2', accounts = {}}},
                  {timeout = 5})
```
P.S. этот кусочек из документации, просто чтобы было понимание о чем я говорю
если для каждой записи свой бакет, то только в цикле
даже если использовать модуль, который от вас это спрячет (как предложенный круд), то всё равно это будет цикл
источник

M

MAPC in Tarantool
@inthrax  @seet61  понял. Спасибо !
источник

DK

Dmitry Krokhin in Tarantool
Mons Anderson
А у вас та же самая проблема )
Попробуйте тот же самый рецепт, только вам я поставил бы нижнюю границу меньше:
memtx_min_tuple_size = 8,
slab_alloc_factor = 2,

у вас данные заканчиваются до 256 байт. 8 я получил как 256-31*8.
т.о. будут слабы 8, 16, 24, ... 256, а потом увеличением x2: 512, 1024, 2048, ...
Спасибо! Попробуем
источник

VS

Vladislav Shpilevoy in Tarantool
Если бакеты повторяются, то можно в батчи собрать самому, и вызвать по разу на бакет свою функцию. Если бакетов супер много в батче, то можно через vshard.router.route() найти, какие бакеты идут на один и тот же репликасет. Послать на него свой батч через :call на там, что вернул route(). Там зарефать нужные бакеты через vshard.storage.ref. Если все рефы сработали, то сделать свои операции. И потом unref на все эти бакеты.
источник

M

MAPC in Tarantool
Vladislav Shpilevoy
Если бакеты повторяются, то можно в батчи собрать самому, и вызвать по разу на бакет свою функцию. Если бакетов супер много в батче, то можно через vshard.router.route() найти, какие бакеты идут на один и тот же репликасет. Послать на него свой батч через :call на там, что вернул route(). Там зарефать нужные бакеты через vshard.storage.ref. Если все рефы сработали, то сделать свои операции. И потом unref на все эти бакеты.
Довольно интересный вариант.
источник

M

MAPC in Tarantool
Вот только звучит так будто на написание одной функции часов 5 уйдет )
источник

VS

Vladislav Shpilevoy in Tarantool
Возможно
источник

MA

Mons Anderson in Tarantool
MAPC
Вот только звучит так будто на написание одной функции часов 5 уйдет )
или минут :)
local to_call = {}
for row in pairs(mydata) do
 local bucket = calc_my_bucket_id(row)
 to_call[bucket] = to_call[bucket] or {}
 table.insert(to_call[bucket], row)
end

for bucket,rows in pairs(to_call) do
 vshard.router.call(bucket,'write','customer_add', {rows})
end
источник

M

MAPC in Tarantool
Mons Anderson
или минут :)
local to_call = {}
for row in pairs(mydata) do
 local bucket = calc_my_bucket_id(row)
 to_call[bucket] = to_call[bucket] or {}
 table.insert(to_call[bucket], row)
end

for bucket,rows in pairs(to_call) do
 vshard.router.call(bucket,'write','customer_add', {rows})
end
Сильно)
источник

VS

Vladislav Shpilevoy in Tarantool
Если у тебя, скажем, на один сторадж идет 100к бакетов, тоже луп такой оставишь?
источник

VS

Vladislav Shpilevoy in Tarantool
100к похода по сети туда-обратно вместо одного.
источник

VS

Vladislav Shpilevoy in Tarantool
Есть правда еще вариант - сделать как Монс говорит, но слать через is_async. Тогда они хотя бы в батчи соберутся перед отправкой. Потом собрать результаты через wait_result в цикле
источник

MA

Mons Anderson in Tarantool
Во входной задаче было ~ 1000. Поэтому я не оптимизировал
Так-то есть много вариантов. Можно ещё в файберы это завернуть, тогда параллельно пойдут
источник

VS

Vladislav Shpilevoy in Tarantool
is_async пойдет не хуже файберов, но без самих файберов
источник

MA

Mons Anderson in Tarantool
Vladislav Shpilevoy
is_async пойдет не хуже файберов, но без самих файберов
Вообще да
источник

AP

Alexandra Pisminskay... in Tarantool
Всем привет! Кто-нибудь собирал Сишный коннектор под VS2017? Еcть ли опыт сборки коннекторов под Win?
источник