.net - 海量数据快速可视化的方法

标签 .net performance algorithm compression plot

我正在寻找一些方法来压缩大量(且动态增长的)数据以在图形 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/

相关文章:

c# - 如果与开关速度

algorithm - 彼得森的算法是否满足饥饿?

algorithm - 水算法问题最多的容器

javascript - 无法获取资源 'https://jcenter.bintray.com/com/android/tools/build/gradle/2.1.0/gradle-2.1.0.pom'

c# - 第三方类未在 'using' 中加载。附加类安装在哪里?

C#克隆一个堆栈

php - 如何解决执行查询时的数据库锁定问题

regex - 解析许多小字符串或单个大字符串 - 哪个更快?

algorithm - 是否有可能使 `foldrRanges` 与 `foldrRange2D` 一样快?

c# - RegEx 匹配一个模式,只要它前面没有不同的模式