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

标签 c++ windows file-io

我有一个元素 (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/

相关文章:

c++ - libcudart.so.5.5,/usr/local/lib/libopencv_core.so 需要

c++ - 复制另一个进程正在使用的文件

java - 创建大文件(> 1GB)的最有效方法

c# - 当我尝试通过 WinRT 对象从 C++ 调用回调到 C# 时如何解决此 E_POINTER (NullPointerException)?

c++ - 为什么我的 COM 智能指针在从方法返回时被删除

c++ - 捕获多个参数

linux - 如何通过 SSHLibrary 编辑远程文件?

C# - 检测用户是否使用Windows 7或Windows 8

python - 在输出文件 [Python] 中写入超过 80 个字符的行

java - PrintWriter未写入文件,尝试添加flush()和close() Java