Как сохранить boost :: multi_array в файл

Я ищу простой способ сохранить и загрузить из файла 3D boost :: multi_array.
Насколько я знаю, в библиотеке Boost нет методов, которые я нахожу странными.

Мне не нужно, чтобы файл был удобочитаемым человеком, поэтому бинарный файл был бы лучше для производительности.
Может кто-нибудь указать мне на готовое решение или дать мне идеи о том, как реализовать такие методы чтения / записи?

Я использую 3D multi_arrays типов bool и ints, поэтому мне нужно использовать шаблон.

1

Решение

Нет необходимости использовать некоторые специальные библиотеки сериализации, потому что ваши данные уже сериализуются в памяти, и вы можете получить их следующим образом (предположим, 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, но я считаю, что другие платформы должны иметь аналогичную функциональность. Проверка ошибок опущена для ясности.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector