我们目前正在使用 ZedGraph 来绘制一些数据的折线图。输入数据来自任意大小的文件,因此,我们事先不知道最大数据点数是多少。但是,通过打开文件并读取文件头,我们可以找出文件中有多少个数据点。
文件格式本质上是[time (double), value (double)]。但是,这些条目在时间轴上并不统一。在 t = 0 sec 和 t = 10 sec 之间可能没有任何点,但在 t = 10 sec 和 t = 11 sec 之间可能有 100K 个整数,依此类推。
例如,我们的测试数据集文件约为 2.6 GB,它有 324M 点。我们想向用户展示整个图表并让她浏览图表。然而,将 324M 点加载到 ZedGraph 不仅是不可能的(我们在 32 位机器上),而且也没有用处,因为在屏幕上有这么多点是没有意义的。
使用 ZedGraph 的 FilteredPointList 功能似乎也不成问题,因为这需要首先加载整个数据,然后对该数据执行过滤。
因此,除非我们遗漏任何东西,否则我们唯一的解决方案似乎是 - 以某种方式 - 抽取数据,但是随着我们不断努力,我们遇到了很多问题:
1- 我们如何抽取未及时统一到达的数据?
2-由于无法将整个数据加载到内存中,因此任何算法都需要在磁盘上运行,因此需要仔细设计。
3- 我们如何处理放大和缩小,尤其是当数据在 x 轴上不均匀时。
如果数据是统一的,在初始加载图时,我们可以Seek()
通过文件中预定义的条目数量,每隔 N 个样本选择一次并将其提供给 ZedGraph。但是,由于数据不统一,我们必须更加智能地选择要显示的样本,并且我们无法提出任何不必读取整个文件的智能算法。
我很抱歉,因为这个问题没有尖锐的特异性,但我希望我能解释我们问题的性质和范围。
我们使用的是 Windows 32 位、.NET 4.0。