10 подписчиков
Опять намудрил чего-то.
Итак, нам нужно посчитать данные какого-то интервала (либо накатить на него изменения). Желательно так, чтобы если возможно разделить вычисления на сериализуемые куски — то разделить их (иначе на совсем больших интервалах потенциально можем в память не влезть).
Реализация функции с опциями с картинки будет смотреть дифф коллекции, если видит изменения записей в исходной коллекции, то определяет по записи интервал к которому она принадлежит, вычитывает прошлую итоговую версию этого интервала, начинает шайтанщину. Берём до какого-то лимита соседних изменений, получаем ReducedItem. Например, если у нас есть 100к изменений, то превращаем их в 100 этих ReducedItem. Затем можем при помощи merge() сделать из 100 сначала 10, а затем получить один финальный. Передаём его в apply() вместе со старым значением этого интервала и получаем новый.
На простых кейсах вроде суммирования каких-то чисел оно совсем неплохо должно работать, распараллелится и полетит. Понаходили разницу в независимых кусках, сплюсовали разницы между собой, прибавили разницу к прошлому значению и готово.
С штуками вроде перцентилей всё хуже (хотя насколько я помню есть методы для их приблизительного вычисления где не нужно прям весь массив элементов составлять), но я пока не собираюсь их считать, как соберусь — сделаю для них совсем отдельную штуковину. Пока собираюсь только брать средневзвешенное между уже посчитанными перцентилями, надеюсь меня не накажут, не знаю насколько это корректно (т.е. есть, например, медиана 4.87 c количеством элементов 385, медиана 6.12 с количеством элементов 748, получается 4.87 * (385 / (385 + 748)) + 6.12 * (748 / (385 + 748)) = 5.7 с количеством элементов 1133). Мне вполне достаточно, чтобы посмотреть на порядок чисел.
#diffbelt
1 минута
2 ноября 2022