快速可视化大量数据的方法

时间:2012-07-12 09:54:23

标签: .net performance algorithm compression plot

我正在寻找一些方法来压缩大量(并且动态增长)的数据量,以便在图表视图中进行可视化。

假设我有一个由时间戳值对组成的二进制文件。这个文件实时增长,很容易超过几千兆字节。

现在有多个视图将这些数据显示为图形/图表。由于在大多数情况下,我们的x轴上的数据远远多于像素,因此我们需要以某种方式将此数据压缩到所需的分辨率。每个视图可能需要不同的分辨率,具体取决于屏幕上的大小。放大和缩小也会导致快速更改分辨率。

当前算法将数据分成相等长度的部分并计算最小值和最大值。现在,对于x轴上的每个像素,我们绘制从最小值到最大值的垂直线。这样我们就不会错过异常值。 (这是一项要求)

每次需要新的分辨率时,我们必须选择另一个部分长度并浏览整个文件,这是减慢速度的方法。

解决方案是创建某种缓存层,允许我们对不同分辨率的数据进行(恒定时间)调用。不幸的是,我不知道如何以一种仍然向我们展示异常值的方式实现这样的缓存。

您是否有任何提示或知道文献显示解决此类问题的方法?

环境是Microsoft .net,但这不应该有所不同,因为这是关于一般的想法。

提前致谢。

1 个答案:

答案 0 :(得分:2)

我的方法是将数据存储在几个文件中,如下所示:

  • 将{timestamp,value}附加到FILE [0]。
  • for i = 0 ... MAX_REASONABLE:
    • 如果FILE [i]的样本数模ZOOM非零,则退出。
    • 从FILE [i]获取最后的ZOOM样本。
    • 将它们压缩成单个样本(例如,平均时间戳?获得最小值?) 和平均样本数据。
    • 如果FILE [i + 1]不存在,请创建它。
    • 将新创建的样本写入FILE [i + 1]

数据总量收敛到SIZE *(1 /(1-(1 / ZOOM))) - 如果ZOOM = 2则需要100%的额外空间,如果ZOOM = 4则需要33%,依此类推。

在可视化时,您可以快速选择要显示的最接近级别。假设你需要在包含600.000个样本的范围内可视化800个像素,ZOOM = 2;然后600.000 / 800的对数除以ZOOM的对数得出9.55,这意味着你需要访问9级缩放。

该文件被缩放ZOOM ^ 9 = 512次,即您将读取600.000 / 512 = 1171个样本并将1171 x H图像重新采样为800像素宽度。

总写入成本平均最多可增加300%;总存储需求将增加最多100%;要生成图像,您的成本会或多或少地保持不变,具体取决于您生成的屏幕图像的宽度。

我已经开发过这样的地图渲染系统,并且可以通过实时平移和缩放显示来自terapixel地图的矩形区域(网络吞吐量和延迟除外,即:我们使用JPEG质量播放) )。