读大二进制文件

时间:2014-04-22 06:14:33

标签: delphi delphi-2010 c++builder binaryfiles binary-data

我正在开发一个项目,我将一些信号(1D数组)记录到二进制文件中。我可以存储大量数据(通常是几千兆字节)。现在我想加载这些文件。

我有两个可视组件。一个叫做概述,另一个叫普通的Y / T图表。概述应该让用户知道完整文件(大文件)中的内容,而图表只显示文件的一部分,通常是部分,在概述中选择可调整大小的矩形/带。

因为文件可能非常大,所以加载到内存根本不是最佳的,所以主要的想法是加载到内存(最多几MB)只有重要的数据/可见数据。因此,加载和显示是根据用户需求完成的。如果用户放大图表,则需要使用文件中的更多数据点重新加载数据。

我的问题是如何绘制Overview组件以最佳方式显示文件的整个内容(没有真正加载文件中的所有样本)。让我们说我的文件大于10GB,我想让用户了解文件中的内容,但我可以绘制最大值。概述组件上的16k样本?

是否有任何方法可以在记录期间存储任何其他数据(如索引,较小的数据块,图像......)以便以后加载和绘制概述组件?目前我只存储样本,但添加其他数据不会成为问题。你有这样的经历吗?

要了解我在做什么:

enter image description here

2 个答案:

答案 0 :(得分:3)

您可以使用多级抽取 - 只存储每个Nth,N ^ 2等样本(例如,10th,100,1000,10000 ......)。当用户更改窗口大小时,选择适当的级别,在此窗口中包含大约1000个样本,加载并快速显示这些样本(1000点对于屏幕上的图表来说只是合理的数字)。

如果您的数据具有某些特性,特殊属性,则可以获得更大(升级)数据集并应用Douglas-Peucker折线简化算法来保留这些特征。

答案 1 :(得分:1)

当我写入文件时,我写了几个固定大小的数据块(取决于DAQ samplerate)。在写入这些块的固定计数之后,我添加一个统计块,其中包含有关已写入多少数据块的信息以及从所有写入数据块一起计算的最大值,最小值,平均值和方差。然后我重复它......直到用户停止录制。

File struct is:

[File header]
[DataChunk1]
[DataChunk2]
...
[DataChunkN]
[StatsChunk1]
[DataChunkN+1]
[DataChunkN+2]
...
[DataChunkN+..]
[StatsChunk2]
....

当我想加载文件并绘制数据时,我只需重新计算我当前在图表上使用缩放设置的数据/ px比率。有两种情况。如果真的是缩放,那么数据/ px比率是< = 1我需要从文件(从数据块)加载适当数量的数据并将其显示在图表上(如果需要,进行一些插值)。绘图很简单......只是从点到点排列,因为我们正在显示所有数据。

如果比率> 1,则加载适当的统计块数(而不是数据块)并使用它们绘制图表。首先,我绘制一个最小和最大的信封(两个系列之间有绘画区域),然后我绘制一个平均值+/-标准的系列。偏差(sqrt(方差)。这样我可以在这个块中显示数据的概述。因为我只读取统计块,读取性能真的很好(快)。如果文件足够大,统计块计数/ px比率变大比1我可以简单地抽取统计块并进行绘图。

关于加载等等的数量...我需要进行一些实验,看看是什么给了我最好的结果,但是第一次试验真的很令人鼓舞。稍后我会添加一些关于最终结果的评论和一张照片来展示它。感谢您的想法和贡献。