Запись массива в файл с другим порядком - PullRequest
1 голос
/ 21 марта 2012

У меня есть 3d-массив элемента (x, y, z), которого нет в памяти из-за его возможного размера, превышающего 4 ГБ. В каждом цикле я могу получить только двумерный массив (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 ++?

1 Ответ

0 голосов
/ 21 марта 2012

C / C ++ дает массивы, организованные по x как самый большой непрерывный срез, поэтому data [7] содержит каждое значение для data [7] [0-YMAX] [0-ZMAX] 2d-единицы, аналогично data [7] [ 3] [0-ZMAX] - это следующая 1d единица

Так, каковы определения данных и element_size?

Когда вы пишете подмножество массива, у него будут непрерывные элементы Z, и каждый из этих срезов Z будет иметь постоянную Y. Если вы выполняете ввод-вывод с более чем одним набором смежных наборов значений Z, у вас будут кусочки с непрерывным Y.

Так что я не понимаю:

Я могу легко сохранить их в файл порядка (x, z, y), используя ...

Возможно, меня неправильно поняли, но я не думаю, что код делает это. Я думаю, что это пишет элементы X, Y, Z

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...