Почти реализовал, начал писать тесты, дебажить и выяснил, что я наврал, нельзя так делать. Проблема в том, что когда мы читаем ключи вокруг другого ключа нам нужны ключи не последней версии (где все они вокруг уже наменяны), а всегда той версии в процессе обработки которой мы находимся.
Т.е. нам нужно вычитывать ключи той версии, с которой начинается наш дифф и в процессе обработки диффа менять эти ключи (и помнить изменения за границами этих «вокруг»). Звучит уже не как константная память.
... но придумал замечательный костыль. Добавлю в базу понятие «фантомные правки». Можно будет сказать «найди ключ K с версией V, для фантомного мира Q значение на этой версии у него будет R». А затем при чтениях можно указать «хочу видеть фантомные правки Q», что будет выдавать подправленные данные (а без этого параметра — настоящие).
Тогда когда будем считать эти перцентили будем на ходу подправлять данные для себя, а как закончим, попросим потерять эти изменения (или они позже сами подчистятся если никто фантомов с таким идентификатором не трогал какое-то время).
Выглядит так будто добавить это просто и на производительность особо не повлияет (хотя я пока за неё и не парюсь совсем).
Как закончу с перцентилями, дорисую графички с новыми типами (подсчёт уникальных значений я уже сделал, осталось подождать ещё пару дней пока логов побольше набежит, ну и чутка кода написать чтобы оно в график превращалось). А после буду думать, как это добро можно было бы не целиком в памяти хранить, а на диске. Так глядишь и до шардирования дойдём.
#diffbelt
Т.е. нам нужно вычитывать ключи той версии, с которой начинается наш дифф и в процессе обработки диффа менять эти ключи (и помнить изменения за границами этих «вокруг»). Звучит уже не как константная память.
... но придумал замечательный костыль. Добавлю в базу понятие «фантомные правки». Можно будет сказать «найди ключ K с версией V, для фантомного мира Q значение на этой версии у него будет R». А затем при чтениях можно указать «хочу видеть фантомные правки Q», что будет выдавать подправленные данные (а без этого параметра — настоящие).
Тогда когда будем считать эти перцентили будем на ходу подправлять данные для себя, а как закончим, попросим потерять эти изменения (или они позже сами подчистятся если никто фантомов с таким идентификатором не трогал какое-то время).
Выглядит так будто добавить это просто и на производительность особо не повлияет (хотя я пока за неё и не парюсь совсем).
Как закончу с перцентилями, дорисую графички с новыми типами (подсчёт уникальных значений я уже сделал, осталось подождать ещё пару дней пока логов побольше набежит, ну и чутка кода написать чтобы оно в график превращалось). А после буду думать, как это добро можно было бы не целиком в памяти хранить, а на диске. Так глядишь и до шардирования дойдём.
#diffbelt