Versions
river version: 0.10.1
Python version: 3.10.2
Describe your task
Keeping track of a rolling quantile over a large window. Once the RollingQuantile reaches the windows size, it removes the oldest value and appends the new value. For 'small' windows ( ~ < 100k ) this is no problem and the code runs really fast, but with larger window sizes (say, 500k) once the window is full, there is a significant performance drop when updating the RollingQuantile. I think the issue is primarily in the underlying utils.SortedWindow.
Furthermore, though the RollingQuantile is indeed a streaming algorithm, but there may be some downsides on the memory and computational complexity side when handling large windows (O(n)). Because the entire window is kept in memory and being used to calculate the quantile, it's really accurate. However, maybe we could trade in some of this accuracy for performance, e.g. by estimating the quantile just like the regular Quantile class, but then windowed (although I currently don't know of a specific algorithm that solves this issue, there are a few papers out there though).
What kind of performance are you expecting?
Until the window is full: 347195 iterations/s
Once the window is full: 279 iterations/s
Steps/code to reproduce
from river.stats import RollingQuantile
from tqdm import tqdm
q = 0.997
rolling_q = RollingQuantile(window_size=500_000, q=q)
for x in tqdm(range(500_000)):
rolling_q.update(x)
for x in tqdm(range(500_000)):
rolling_q.update(x)
Versions
riverversion: 0.10.1Python version: 3.10.2
Describe your task
Keeping track of a rolling quantile over a large window. Once the RollingQuantile reaches the windows size, it removes the oldest value and appends the new value. For 'small' windows ( ~ < 100k ) this is no problem and the code runs really fast, but with larger window sizes (say, 500k) once the window is full, there is a significant performance drop when updating the
RollingQuantile. I think the issue is primarily in the underlyingutils.SortedWindow.Furthermore, though the
RollingQuantileis indeed a streaming algorithm, but there may be some downsides on the memory and computational complexity side when handling large windows (O(n)). Because the entire window is kept in memory and being used to calculate the quantile, it's really accurate. However, maybe we could trade in some of this accuracy for performance, e.g. by estimating the quantile just like the regularQuantileclass, but then windowed (although I currently don't know of a specific algorithm that solves this issue, there are a few papers out there though).What kind of performance are you expecting?
Until the window is full: 347195 iterations/s
Once the window is full: 279 iterations/s
Steps/code to reproduce