c ++ - Skriver 3d array i en fil med forskellig rækkefølge

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har 3d array af element (x, y, z), der ikke er i hukommelsen på grund af dens mulige størrelse større end 4GB. I hver loop kan jeg kun få et 2D array af (x, z). På grund af denne begrænsning,


Jeg kan nemt gemme dem i en ordrefil (x, z, y) ved hjælp af


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);


hvilket er det samme som


         fwrite( (unsigned int *)(data), element\_size, nx*nz, fp);


Men for en fil af orden (x, y, z) skal jeg gøre det for hver 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);
}


Dette er dog meget langsomt. Er der nogen bedre måde at gøre dette i VC ++?

Bedste reference


C/C ++ giver arrays arrangeret af x som det største sammenhængende skive, så data [[7]] indeholder hver værdi for data [[7]] [[0-YMAX]] [[0-ZMAX]] en 2d enhed, tilsvarende data [[7]]
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);
}
[[0-ZMAX]] er den næste 1d-enhed


Så hvad er definitionerne af data og element\_size?


Når du skriver en delmængde af arrayet, vil den have sammenhængende elementer i Z, og hver af disse Z-skiver vil have en konstant Y. Hvis du gør I/O med mere end et sæt sammenhængende sæt Z-værdier, vil du have skiver med tilstødende Y.


Så jeg forstår ikke:



  Jeg kan nemt gemme dem i en ordrefil (x, z, y) ved hjælp af ...



Jeg har muligvis misforstået, men jeg tror ikke, at koden gør det. Jeg tror, ​​det skriver x, y, z elementer