我要做的是:我试图将一部分3D空间离散化为小立方体,即将物理空间的一部分(如其x、y、z笛卡尔坐标所描述的)转换为3D网格。此数组的每个元素都有一个double
类型的距离值。网格存储为1D数组,其中任何点(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
函数跳转到文件中的特定位置(即数组中的索引),但只写一个150MB的小文件大约需要5分钟。请注意,读取文件并不是一个大问题;一旦写入文件,就不会经常需要读取它,而且我可以接受与非顺序访问相关的延迟。我只需要一种快速的方法来创建文件。
正如marom所指出的,您应该使用内存映射文件。但获得连续访问的一种方法是将数据存储为BSP或BVH(如VP树或kd树)。另一种方法是使用空间填充曲线(如三维peano曲线)来索引点。