我正在寻找一种简单的方法来保存并从文件中加载3D boost :: multi_array。 据我所知,Boost库中没有任何方法我觉得很奇怪。
我不需要该文件是人类可读的,因此二进制文件对性能会更好。 有人能指出我现成的解决方案,或者给我一些关于如何实现这种读/写方法的想法?
我使用bool和int类型的3D multi_arrays,所以我需要使用模板。
答案 0 :(得分: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,但我相信其他平台应该具有类似的功能。为清楚起见,省略了错误检查。