如何将 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 保存到文件中的主要内容,如果未能解决你的问题,请参考以下文章

c++ boost::multi_array 索引太大

boost::multi_array 的内存大小

有没有简单的方法来动态增加 boost::multi_array 维度?

Boost multi_array BOOST_ASSERT抛出一个断点

Q_DECLARE_METATYPE 提升::multi_array

boost Array Example