我正在寻找一种简单的方法来保存和从文件中加载 3D boost::multi_array。据我所知,Boost 库中没有我觉得奇怪的方法。
我不需要该文件是人类可读的,因此二进制文件会更好地提高性能。谁能指点我一个现成的解决方案或给我有关如何实现此类读/写方法的想法?
我使用 bool 和 ints 类型的 3D multi_arrays,所以我需要使用模板。
我正在寻找一种简单的方法来保存和从文件中加载 3D boost::multi_array。据我所知,Boost 库中没有我觉得奇怪的方法。
我不需要该文件是人类可读的,因此二进制文件会更好地提高性能。谁能指点我一个现成的解决方案或给我有关如何实现此类读/写方法的想法?
我使用 bool 和 ints 类型的 3D multi_arrays,所以我需要使用模板。
不需要使用一些特殊的序列化库,因为你的数据已经在内存中序列化了,你可以通过如下方式获取(假设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
和 call的调用memcpy(data, buf, bytes);
。
更好的方法是,如果您的数据很大,您只需将数据存储在一个文件中,用于mmap
将其映射到内存地址,然后将地址传递给multi_array_ref
. 在这种情况下,您不需要专门将其写入文件。它是由操作系统芳香地完成的。
上面的代码是为 Linux 考虑的,但我相信其他平台应该有类似的功能。为清楚起见,省略了错误检查。