如何将 boost::multi_array 保存到文件中
Posted
技术标签:
【中文标题】如何将 boost::multi_array 保存到文件中【英文标题】:How to save a boost::multi_array to a file 【发布时间】:2012-11-18 13:32:36 【问题描述】:我正在寻找一种简单的方法来保存和从文件加载 3D boost::multi_array。 据我所知,Boost 库中没有我觉得奇怪的方法。
我不需要该文件是人类可读的,因此二进制文件会更好地提高性能。 谁能指点我一个现成的解决方案或给我有关如何实现此类读/写方法的想法?
我使用 bool 和 ints 类型的 3D multi_arrays,所以我需要使用模板。
【问题讨论】:
Boost serialization 怎么样? 好的,我正在读这个。看起来这就是我需要的。我寻找“将 boost_multi_arrays 保存到文件”的方法,但我不知道序列化是关键字。谢谢 【参考方案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 考虑的,但我相信其他平台应该有类似的功能。为清楚起见,省略了错误检查。
【讨论】:
谢谢!这非常有用! 我假设multi_array
中的元素是普通的旧数据,没有指向其他内存位置的指针。如果您的情况比这更复杂,您仍然需要编写一些特定的序列化方法。以上是关于如何将 boost::multi_array 保存到文件中的主要内容,如果未能解决你的问题,请参考以下文章
有没有简单的方法来动态增加 boost::multi_array 维度?
Boost multi_array BOOST_ASSERT抛出一个断点