Вместо сохранения последних N значений, организуйте свои значения в «сегменты» с заранее определенным размером сегмента, и для каждого сегмента сохраняйте только сумму всех значений в блоке.
Всякий раз, когда блокзаполнен, вы можете удалить самое старое ведро.(Лучший способ сделать это - кольцевой буфер)
Это позволяет вам сократить использование памяти с коэффициентом BUCKET_SIZE, но, очевидно, ваше среднее значение больше не по последним значениям N, а по последнимОт N до N + BUCKET_SIZE.