高效执行文件I / O,以便对大型3D网格进行非顺序访问

时间:2016-03-25 10:51:36

标签: c++ algorithm file-io

我想要做的事情:我试图将一部分3D空间离散成小块,即我转变为物理空间的一部分(如通过其x,y,z笛卡尔坐标描述成3D网格。此数组的每个元素都有一个double类型的距离值。网格存储为一维数组,其中任何点(x,y,z)使用以下方法映射到数组索引:

z + y*dim_xy + x*dim_x,其中dim_xy是网格的2D切片的大小,dim_x是单轴的大小(基本上它类似于隐含的内容)当您创建3D阵列并使用3D索引值访问它时。)

问题:我想以非常精细的分辨率离散相当大的3D空间。生成的阵列大小约为4-6GB。如果我只是使用new运算符创建数组,我的程序会由于缺少RAM而崩溃(实际上有时整个系统崩溃了5-6分钟)。

我建议的解决方案,以及它的错误:我试图将数组存储为二进制文件。问题是虽然顺序I / O操作相当快,但非顺序I / O操作需要相当长的时间。在我的例子中,网格的距离值以从广度优先的方式从指定点开始计算。因此,即使算法以连续(略微)处理连续(x,y,z)点的方式进行,但是它们映射到的数组索引在迭代到迭代之间显着变化。这就是为什么我不能创建一个较小的临时数组,用数字填充它并一次性写入文件。

我的主要问题是以节省时间的方式编写文件的所有内容。现在,我在每次迭代时都使用seek函数跳转到文件中的特定位置(即数组中的索引),但是只需要写5分钟就可以了一个150MB的小文件。请注意,阅读文件并不是一个大问题;一旦文件被写入,读取它的需要不会经常出现,我可以接受与非顺序访问相关的延迟。我只需要一种快速创建文件的方法。

1 个答案:

答案 0 :(得分:0)

正如marom所指出的那样,你应该使用内存映射文件。但是获得连续访问的方法是将数据存储为BSP或BVH(如VP树或kd树)。另一种方法是使用空间填充曲线(如3d peano曲线)来索引点。