2008-11-04 2 views
2

В продукте, над которым я работаю, существует итерационный цикл, который может иметь от нескольких сотен до нескольких миллионов итераций. Каждая итерация вычисляет набор статистических переменных (двойная точность), а число переменных может быть до 1000 (обычно 15-50).Графирование больших объемов данных

В рамках цикла мы график изменения переменных более итераций, так что ось Х представляет собой итерации, а ось Y являются переменными (кодированные по цвету):

http://sawtoothsoftware.com/download/temp/walt/graph.jpg

В настоящее время данные хранятся в файле, содержащем:
4-байтовое целое число, для которого переменная,
a 4-байтовое целое, для которого итерация,
и 8-байтовый двойной для значения.

Общая шкала оси y изменяется с течением времени, и желательно, чтобы размер графика изменялся для размещения текущего масштаба (это видно на рисунке).

При примерно 5-секундных интервалах данные считываются и строятся на растровом изображении, которое затем отображается пользователю. Мы пытаемся сделать несколько оптимизаций, чтобы не перекрасить все это, но если число итераций или число переменных становится большим, мы получаем огромный файл, который занимает больше 5 секунд.

Я ищу идеи о том, как обрабатывать эти данные намного эффективнее и быстрее, если это возможно.

+0

какая библиотека, какой язык? Недостаточно информации – WolfmanDragon 2008-11-04 22:17:58

+0

Язык C++ с использованием Visual Studio 2008. Конкретный код находится в COM-модуле. – 2008-11-04 22:43:58

ответ

3

Вы должны спросить себя, насколько ценно отображать данные для каждой итерации, и как насчет этих данных, которые действительно интересуют пользователи. Я думаю, что главное, что вам нужно сделать, это просто уменьшить объем данных, отображаемых пользователем.

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

Чтобы избежать перекомпоновки точек данных при перерисовке, просто держитесь вокруг небольшого набора точек, которые вы уже нарисовали в памяти, вместо того, чтобы перекомпилировать или перезагрузить все данные. Вы можете избежать выхода на диск таким образом, и вы не будете делать почти столько же работы, чтобы все эти очки отображались снова.

Если вас беспокоят такие вещи, как недостающие выбросы из-за ошибки выборки, простая вещь, которую вы можете сделать, - это вычислить набор выборочных точек на основе скользящих окон вместо отдельных выборок из исходных данных. Вы можете поддерживать максимальный, минимальный, средний, средний и, возможно, вычислять полосы ошибок для данных, которые вы показываете пользователю.

Если вам нужно действительно агрессивно, люди придумали массу причудливых методов для уменьшения и отображения данных временных рядов. Для получения дополнительной информации, вы можете проверить the wikipedia article или посмотреть на инструментальные средства, такие как R, в которых уже есть много этих методов.

И, наконец, this stackoverflow question кажется уместным, тоже.

1

Я вижу по графику, что вы рисуете 10 000 итераций на несколько сотен пикселей, поэтому просто используйте один из 100 информационных точек для графика и игнорируйте остальные.Он будет выглядеть одинаково для пользователей

4

В терминах SQL вы должны группировать и агрегировать результаты. Вы не можете показать все 10 000 точек данных на графике, не прокручивая экран. В одном случае вы можете группировать по шкале времени (секунды, минуты и т. Д.) И запрашивать AVG(), MAX() или MIN(), чтобы уменьшить количество точек данных до меньшего масштаба.

MySQL, например, с помощью группы секунд:

select time_collected, AVG(value) 
from Table 
group by UNIX_TIMESTAMP(time_collected) 

также рассмотреть вопрос об объединении совокупных значений и визуализации в candle stick chart.

0

Почему вы не создаете растровое изображение (или pixmap, например XPM)? Каждый столбец (или строка) соответствует итерации, а высота одинаковых цветов (ширина для строк) соответствует значению переменной. Формат XPM проще, поскольку он является текстовым (один символ для пикселя) и кросс-платформенным.

Смежные вопросы