在我工作的产品中,有一个迭代循环,可以有几百到几百万次迭代。每次迭代都会计算一组统计变量(双精度),变量数最多可达1000(通常为15-50)。
作为循环的一部分,我们绘制了迭代中变量的变化图,因此X轴是迭代,y轴是变量(按颜色编码):
http://sawtoothsoftware.com/download/temp/walt/graph.jpg
目前,数据存储在包含以下内容的文件中:
变量的四字节整数,
迭代的4字节整数,
和值为8字节的双倍。
y轴的总比例随时间变化,并且希望图表调整大小以适应当前比例(这可以在图片中看到)。
以大约5秒的间隔,读取数据并将其绘制在位图上,然后将位图显示给用户。我们尝试做一些优化以避免重新绘制整个内容,但如果迭代次数或变量数量变大,我们最终会得到一个超过5秒的巨大文件来绘制。
如果可能的话,我正在寻找有关如何更有效,更快地处理这么多数据的想法。
答案 0 :(得分:4)
在SQL术语中,您应该对结果进行分组和汇总。如果不滚动屏幕,您无法在图表上显示所有10,000个数据点。一种方法是您可以按时间刻度(秒,分钟等)进行分组,并查询AVG()
,MAX()
或MIN()
以将数据点缩小到较小的范围。 / p>
MySQL示例,按秒组:
select time_collected, AVG(value)
from Table
group by UNIX_TIMESTAMP(time_collected)
还考虑在candle stick chart中结合汇总值和可视化。
答案 1 :(得分:3)
您应该问自己,每次迭代显示数据的价值是多少,以及用户真正关心的数据如何。我认为您需要做的主要事情就是减少向用户显示的数据量。
例如,如果用户只关心趋势,那么只需每隔这么多次迭代(而不是每次迭代)就可以轻松地评估这些函数。在上面的图表中,您可以通过每100次迭代仅绘制曲线上的值来获得信息,这可以将数据集的大小(以及绘制算法的速度)减少100倍。显然,如果你需要更多细节,你可以调整它。
为了避免在重绘时重新计算数据点,只需保留已经在内存中绘制的一小组点,而不是重新计算或重新加载所有数据。你可以避免以这种方式进入磁盘,并且你不会做太多的工作来获得所有那些再次渲染的点。
如果您担心由于采样错误导致丢失异常值等问题,您可以做的一件事就是根据滑动窗口计算样本点集,而不是原始数据中的单个样本。您可以保留最大,最小,平均值,中位数,并可能计算显示给用户的数据的误差条。
如果你需要变得非常积极,人们已经提出了许多减少和显示时间序列数据的奇特方法。有关详细信息,您可以查看the wikipedia article,或查看R等工具包,这些工具包已经内置了很多这些方法。
最后,this stackoverflow question似乎也很重要。
答案 2 :(得分:1)
我在图表中看到,您在几百个像素上绘制了10,000次迭代,因此只需使用100个信息点中的一个作为图形,并忽略其余部分。它看起来与用户相同
答案 3 :(得分:0)
为什么不生成位图(或XPM像素图)?每列(或行)对应于迭代,相同颜色的高度(行的宽度)对应于变量值。 XPM格式更简单,因为它是文本(像素为一个字符)和跨平台。