我有一个元素 (x,y,z) 的 3d 数组,它不在内存中,因为它的大小可能大于 4GB。在每个循环中,我只能得到一个 (x,z) 的二维数组。由于这个限制,
我可以很容易地将它们保存到一个顺序为 (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] 的每个值一个二维单元,类似 data[7][ 3][0-ZMAX]是下一个1d单元
那么data和element_size是怎么定义的呢?
当您编写数组的一个子集时,它将具有连续的 Z 元素,并且每个 Z 切片都将具有一个常量 Y。如果您使用一组以上的连续 Z 值集进行 I/O,你将拥有连续 Y 的切片。
所以我不明白:
I can easily save them into a file of order (x,z,y) using ...
我可能误解了,但我认为代码不会那样做。我认为它写了 x,y,z 元素
关于c++ - 将 3d 数组写入具有不同顺序的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9808093/