gpt4 book ai didi

c++ - 为大型 3D 网格的非顺序访问高效执行文件 I/O

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:50 24 4
gpt4 key购买 nike

我正在尝试做的事情:我正在尝试将 3D 空间的一部分离散化为小立方体,即我正在转动物理空间的一部分(如其 x,y 所描述的那样) ,z 笛卡尔坐标)转换成 3D 网格。该数组的每个元素都有一个与之关联的 double 类型的距离值。网格存储为一维数组,其中任何点 (x, y, z) 使用以下方法映射到数组索引:

z + y*dim_xy + x*dim_x,其中 dim_xy 是网格二维切片的大小,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 树)。另一种方法是使用空间填充曲线(如 3d peano 曲线)来索引点。

关于c++ - 为大型 3D 网格的非顺序访问高效执行文件 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36218548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com