Вы должны спросить себя, насколько ценным является отображение данных для каждой итерации и что насчет этих данных действительно волнует пользователь. Я думаю, что главное, что вам нужно здесь сделать, это просто уменьшить объем данных, которые вы отображаете для пользователя.
Например, если пользователь заботится только о тренде, вы легко можете оценить эти функции только через столько итераций (вместо каждой итерации). На графике выше вы, вероятно, могли бы получить столь же информативный график, рисуя только значение на кривой каждые 100 итераций, что уменьшило бы размер вашего набора данных (и скорость вашего алгоритма рисования) в 100 раз. Очевидно, вы можете настроить это, если вам понадобится больше деталей.
Чтобы избежать необходимости пересчитывать точки данных при перерисовке, просто сохраняйте небольшой набор точек, которые вы уже нарисовали в памяти, вместо повторной обработки или перезагрузки всех данных. Вы можете избежать попадания на диск таким образом, и вам не понадобится почти столько же работы, чтобы снова получить все эти очки.
Если вы беспокоитесь о таких вещах, как пропущенные выбросы из-за ошибки выборки, вы можете просто вычислить набор точек выборки на основе скользящих окон вместо отдельных выборок из исходных данных. Вы можете держать около максимума, минимума, среднего значения, медианы и, возможно, вычислять полосы ошибок для данных, которые вы отображаете пользователю.
Если вам нужно быть действительно агрессивным, люди придумали множество причудливых методов для сокращения и отображения данных временных рядов. Для получения дополнительной информации вы можете проверить статью в википедии или посмотреть наборы инструментов, например R , в которых уже встроено множество этих методов.
Наконец, этот вопрос о переполнении стека также представляется актуальным.