我们目前正在使用ZedGraph绘制一些数据的折线图。输入数据来自任意大小的文件,因此,我们不知道预先指定的最大数据点数。但是,通过打开文件并读取标题,我们可以找出文件中有多少个数据点。

文件格式本质上是[时间( double ),值( double )]。但是,条目在时间轴上不一致。在t = 0秒和t = 10秒之间可能没有任何点,但是在t = 10秒和t = 11秒之间可能有100K整数,依此类推。

例如,我们的测试数据集文件约为2.6 GB,它具有324M点。我们想向用户显示整个图表,并让她浏览图表。但是,将324M点加载到ZedGraph不仅是不可能的(我们在32位计算机上),而且因为在屏幕上没有太多的点而没有用。

使用ZedGraph的FilteredPointList功能似乎也不成问题,因为这需要先加载整个数据,然后再对该数据执行过滤。

因此,除非我们丢失了任何东西,否则似乎唯一的解决方案是对数据进行某种方式的抽取,但是当我们继续进行处理时,就会遇到很多问题:

1-我们如何抽取未按时到达的数据?

2-由于无法将全部数据加载到内存中,因此任何算法都需要在磁盘上运行,因此需要仔细设计。

3-如何处理放大和缩小,特别是当数据在x轴上不一致时。

如果数据是统一的,则在图的初始加载时,我们可以通过文件中预定义的条目数Seek(),并每隔N个样本进行选择,并将其提供给ZedGraph。但是,由于数据不统一,因此在选择要显示的样本时我们必须变得更加聪明,并且我们无法提出任何无需读取整个文件的智能算法。

我很抱歉,因为这个问题没有明确的细节,但我希望我能解释我们问题的性质和范围。

我们使用的是Windows 32位.NET 4.0。

最佳答案

我以前需要这个,而且不容易做到。由于这一要求,我最终编写了自己的图形组件。最终结果更好,因为我输入了我们需要的所有功能。

基本上,您需要获取数据范围(最小和最大可能/需要的索引值),细分为细分(假设为100个细分),然后通过某种算法为每个细分确定一个值(平均值,中位数等)。 )。然后,您可以基于汇总的100个元素进行绘制。这比尝试绘制数百万个点要快得多:-)。

所以我说的与您说的类似。您提到不想绘制每个X元素,因为元素之间可能会花费很长的时间(x轴上的索引值)。我的意思是,对于数据的每个细分,确定什么是最佳值,并将其作为数据点。我的方法基于索引值,因此在您的示例中,在0秒和10秒之间没有数据索引值的情况下,我仍然会将数据点放在那里,它们之间将只有相同的值。

关键是在绘制数据之前先对数据进行汇总。考虑一下您的算法,仔细地做到这一点,有很多方法可以做到,选择一种适合您的应用程序的方法。

您可能不必编写自己的图形组件而只编写数据汇总算法就可以摆脱困境。

关于c# - 绘制海量数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4817960/

10-09 15:31
查看更多