将3d数组写入具有不同顺序的文件中

Writing 3d array into a file with different order

本文关键字:顺序 文件 数组 3d      更新时间:2023-10-16

我有一个元素(x,y,z)的3d数组,它不在内存中,因为它的大小可能大于4GB。在每个循环中,我只能得到一个(x,z)的2D数组。由于这个限制,

我可以使用轻松地将它们保存到有序的文件中(x,z,y)

for (int iz=0;iz < nz; iz++)
    for (int ix=0;ix < nx; ix++)
         fwrite( (unsigned int *)(data+ix+iz*nx), element_size, 1, fp);

与相同

         fwrite( (unsigned int *)(data), element_size, nx*nz, fp);

但是对于一个有序的文件(x,y,z),我必须为每个iy 这样做

for (int iz=0;iz < nz; iz++) {
     fseek(fp,(iy*nx+iz*nx*ny)*element_size,SEEK_SET);
     fwrite( (unsigned int *)(data+iz*nx), element_size, nx, fp);
}

然而,这真的很慢。在VC++中有更好的方法吗?

C/C++将按x组织的数组作为最大的连续切片,因此data[7]包含data[7][0-YMAX][0-ZMAX]的每个值都是一个2d单元,类似地,data[7][3][0-ZMAX]是下一个1d单元

那么data和element_size的定义是什么呢?

当您编写数组的子集时,它将具有Z的连续元素,并且这些Z切片中的每一个都将具有常数Y。如果您使用多个连续的Z值集进行I/O,则将具有连续Y的切片。

所以我不明白:

我可以使用…轻松地将它们保存到顺序(x,z,y)的文件中。。。

我可能误解了,但我不认为代码能做到这一点。我认为它写x,y,z元素