绘制大量数据

Som*_*ter 16 .net c# charts zedgraph large-files

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

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

例如,我们的测试数据集文件大约为2.6 GB,它有324M点.我们想向用户展示整个图表,让她浏览图表.然而,向ZedGraph加载324M点不仅是不可能的(我们使用的是32位机器),但也没用,因为屏幕上没有这么多点.

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

因此,除非我们遗漏任何东西,否则我们唯一的解决办法似乎是 - 以某种方式对数据进行抽取,但是当我们不断努力时,我们遇到了很多问题:

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

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

3-我们如何处理放大和缩小,尤其是当数据在x轴上不均匀时.

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

我道歉,因为这个问题没有特别尖锐的特异性,但我希望我能解释一下我们问题的性质和范围.

我们在Windows 32位,.NET 4.0上.

Gab*_*ana 8

我以前需要这个,这并不容易.由于这个要求,我最终编写了自己的图形组件.最后结果更好,因为我提供了我们需要的所有功能.

基本上你需要获得数据范围(最小和最大可能/需要的索引值),细分为段(比如100段),然后通过某种算法确定每个段的值(平均值,中值等). ).然后根据总结的100个元素进行绘图.这比试图绘制数百万点要快得多:-).

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

重点是在绘制数据之前总结数据.仔细考虑您的算法,有很多方法可以做到这一点,选择适合您应用的方法.

您可能不会编写自己的图形组件而只是编写数据摘要算法.