1

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

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

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

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

每次需要新的分辨率时,我们都必须选择另一个部分长度并遍历整个文件,这会很慢。

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

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

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

提前致谢。

4

1 回答 1

2

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

  • 将 {timestamp, value} 附加到 FILE[0]。
  • 对于 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%;要生成图像,您的成本或多或少会保持不变,具体取决于您生成的屏幕图像的宽度。

我曾在这样的地图渲染系统上工作过,它可以通过实时平移和缩放从太像素地图中显示一个矩形区域(网络吞吐量和延迟除外,也就是说:在那里,我们使用 JPEG 质量)。

于 2012-07-12T10:39:36.310 回答