2

在我从事的产品中,有一个迭代循环,可以有几百到几百万次迭代。每次迭代计算一组统计变量(双精度),变量个数最多可达 1000 个(一般为 15-50 个)。

作为循环的一部分,我们绘制了变量在迭代中的变化,因此 X 轴是迭代,而 y 轴是变量(按颜色编码):

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

目前,数据存储在一个文件中,其中包含:
用于变量
的 4 字节整数,用于迭代的 4 字节整数,
以及用于值的 8 字节双精度。

y 轴的总比例随时间变化,并且希望图形调整大小以适应当前比例(这可以在图片中看到)。

以大约 5 秒的间隔,读取数据并将其绘制在位图上,然后将其显示给用户。我们尝试做一些优化来避免重新绘制整个东西,但是如果迭代次数或变量数量变大,我们最终会得到一个需要超过 5 秒才能绘制的巨大文件。

如果可能的话,我正在寻找有关如何更有效、更快速地处理这么多数据的想法。

4

4 回答 4

4

在 SQL 术语中,您应该对结果进行分组和聚合。如果不滚动屏幕,您不可能在图表上显示所有 10,000 个数据点。一种方法是您可以按时间尺度(秒、分钟等)分组并查询AVG()MAX()MIN()将数据点减少到更小的尺度。

MySQL 示例,按秒分组:

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

还可以考虑结合汇总值并在烛台图中进行可视化。

于 2009-03-06T14:09:07.340 回答
3

您应该问自己,为每次迭代显示数据有多大价值,以及用户真正关心的这些数据是什么。我认为您在这里需要做的主要事情就是减少您向用户显示的数据量。

例如,如果用户只关心趋势,那么您可以很容易地摆脱每次迭代(而不是每次迭代)评估这些函数。在上图中,您可以通过每 100 次迭代仅绘制曲线上的值来获得同样信息丰富的绘图,这会将数据集的大小(以及绘图算法的速度)减少 100 倍。显然,如果您碰巧需要更多细节,您可以调整它。

为避免在重绘时重新计算数据点,只需保留已在内存中绘制的一小部分点,而不是重新计算或重新加载所有数据。您可以避免以这种方式进入磁盘,并且您不会做太多的工作来重新渲染所有这些点。

如果您担心由于采样错误而丢失异常值等问题,您可以做的一件简单的事情是根据滑动窗口而不是原始数据中的单个样本来计算样本点集。您可能会保留最大值、最小值、平均值、中值,并可能计算您向用户显示的数据的误差线。

如果你需要变得非常激进,人们已经想出了很多花哨的方法来减少和显示时间序列数据。有关更多信息,您可以查看wikipedia 文章,或查看R之类的工具包,其中已经内置了很多这些方法。

最后,这个 stackoverflow 问题似乎也很相关。

于 2008-11-04T22:43:06.057 回答
1

我从图表中看到,您在几百个像素上绘制了 10,000 次迭代,因此只需为图表使用 100 个信息点中的一个,而忽略其余部分。它对用户来说看起来是一样的

于 2009-03-06T14:02:18.513 回答
0

为什么不生成位图(或 XPM 之类的像素图)?每列(或行)对应于迭代,相同颜色的高度(行的宽度)对应于变量值。XPM 格式更简单,因为它是文本的(像素一个字符)和跨平台。

于 2011-06-08T06:00:13.563 回答