Я ищу простой способ сохранить и загрузить из файла 3D boost :: multi_array.
Насколько я знаю, в библиотеке Boost нет методов, которые я нахожу странными.
Мне не нужно, чтобы файл был удобочитаемым человеком, поэтому бинарный файл был бы лучше для производительности.
Может кто-нибудь указать мне на готовое решение или дать мне идеи о том, как реализовать такие методы чтения / записи?
Я использую 3D multi_arrays типов bool и ints, поэтому мне нужно использовать шаблон.
Нет необходимости использовать некоторые специальные библиотеки сериализации, потому что ваши данные уже сериализуются в памяти, и вы можете получить их следующим образом (предположим, A
это массив, содержащий int
данные:
int *data = A.data();
size_t size = A.num_elements();
Вы можете просто записать его по одному в файл. Лучшим способом может быть использование mmap
, как следует:
int fd = open("myfile", O_RDWR);
size_t bytes = size * sizeof(int);
ftruncate(fd, bytes);
void *buf = mmap(NULL, bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
memcpy(buf, data, bytes);
close(fd);
munmap(buf, bytes);
Это очень легко перезагрузить данные из файла в A
, Просто пропустите вызов ftruncate
и позвонить memcpy(data, buf, bytes);
,
Еще лучше, если ваши данные огромны, вы просто храните данные в файле, используйте mmap
чтобы сопоставить его с адресом памяти, а затем передать адрес multi_array_ref
, В этом случае вам не нужно специально записывать его в файл. Это ароматно сделано ОС.
Приведенный выше код рассматривается для Linux, но я считаю, что другие платформы должны иметь аналогичную функциональность. Проверка ошибок опущена для ясности.
Других решений пока нет …