我正在寻找一些方法来压缩大量(且动态增长的)数据以在图形 View 中进行可视化。
假设我有一个由时间戳值对组成的二进制文件。此文件实时增长,很容易超过几千兆字节。
现在有多个 View 将此数据显示为图形/绘图。由于在大多数情况下,x 轴上的数据远多于像素,因此我们需要以某种方式将这些数据压缩到所需的分辨率。每个 View 可能需要不同的分辨率,具体取决于它在屏幕上的大小。放大和缩小也会导致该分辨率的快速变化。
当前算法将数据分成等长的部分,并计算最小值和最大值。现在,对于 x 轴上的每个像素,我们绘制一条从最小值到最大值的垂直线。这样我们就可以确保不会错过异常值。 (这是一个要求)
每次需要新的分辨率时,我们都必须选择另一个部分长度并遍历整个文件,这会很慢。
一种解决方案是创建某种缓存层,使我们能够(恒定时间)调用不同分辨率的数据。不幸的是,我不知道如何以仍然向我们显示异常值的方式实现这样的缓存。
您是否有任何提示或知道显示解决此类问题的方法的文献?
环境是 Microsoft .net,但这应该没有什么区别,因为这是关于一般想法的。
提前致谢。
最佳答案
我的方法是将数据存储在多个文件中,如下所示:
- 将 {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%;生成图像的成本或多或少会变得恒定,具体取决于生成的屏幕图像的宽度。
我曾在此类 map 渲染系统上工作过,并且可以通过实时平移和缩放显示来自 terapixel map 的矩形区域(网络吞吐量和延迟除外,也就是说:我们玩的是 JPEG 质量).
关于.net - 海量数据快速可视化的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11449325/