以*实时*访问光盘上文件的数据

时间:2012-02-10 07:55:07

标签: c++ data-structures

我有以下问题需要解决。我必须构建一个图形查看器来查看海量数据集。

我们有一些特定格式的文件,其中有数百万条记录代表实验结果。每条记录代表大图图上的样本点。我见过的最大文件有4370万条记录。

平均文件包含1000万条记录。每条记录都很小(76字节+每个可选12字节)。完整数据无法加载到主存储器中,因为它太大。我已经构建了一种新的文件格式,可以将数据压缩到每个记录48个字节,并将数据组织到彼此关联的块中。我想通过在2D / 3D图中显示记录来“查看”数据。由于数据非常密集,我希望通过加载更多数据并从主内存中删除视图中未显示的数据来逐步提高细节级别。

我还想实时访问相关记录组并预加载类似记录,以便将加载时间保持在最低限度。这将为用户提供平滑的控制来查看数据,而不是类似于在YouTube上以非常慢的互联网连接观看视频的体验。用户不能随意使用控件进行导航,我想使用此信息将相关记录加载到主存储器中。

必须根据当前主存储器中的内容从光盘逐步加载数据。可以删除主存储器中当前上下文中不需要的记录,并在需要时重新加载。

  1. 如何根据某些哈希值高速访问光盘中的数据

  2. 如果要在当前上下文中查看的数据太大,如何管理主内存。如果您的答案是详细程度,那么如何为大型数据集构建它并且该数据是否应该是文件的一部分?

  3. 过去两周我一直在研究这个问题,而且我似乎因为IO速度而陷入困境。

    我使用的是原生C ++,我无法使用GPL下的工作。如果您需要更多信息,请告诉我们。

    拉​​姆

2 个答案:

答案 0 :(得分:1)

在大多数现代文件系统(Linux,Unix,Windows)下,您可以将文件映射到内存中。

这意味着您可以访问文件的内容,就像它完全在内存中一样(例如,您可以使用数据[i ++],strchr(数据,...)等)并且它是执行映射之间的映射的操作系统用过的内存和文件。当您想要读取一些尚未在内存中的数据时,o / s将从文件中获取它。 你应该阅读这个问题的答案:Mmap() an entire large file

答案 1 :(得分:0)

我认为你正在寻找类似于用于在游戏中存储关卡几何的组织,只是你可能(取决于你的程序如何工作以及你需要显示什么数据)只需要一个维度。请参阅Quadtree和类似方法(该文章的底部)。