恢复对象延迟加载包含文件

时间:2014-10-04 14:32:05

标签: c++ lazy-loading boost-serialization

我使用二进制文件使用boost::binary_iarchive_ia恢复对象,但它太重(18GB)并且该对象将整个文件加载到内存中。有没有办法按部分读取文件(延迟加载)以避免内存使用?

我有什么:

std::ifstream ifs(filename); 
boost::archive::binary_iarchive_ia(ifs);
MyObject obj; 
ia >> obj;

2 个答案:

答案 0 :(得分:1)

将我的评论升级为答案:

@cmaster非常接近可以解决的方法,但是他不小心把问题颠倒了。

原始文件从来都不是问题(它一直在流式传输)。

问题在于反序列化试图将数据全部存储在内存中(例如,向量)。所以唯一真正的解决方案是

  • 是将此数据放入(共享?)内存映射中。您可以使用Boost Interprocess中的分配器来帮助您实现此目的。这是一项很大的努力,但在概念上相对简单。

  • 可以修改反序列化代码以便即时转换为不同的磁盘格式(而不是插入到例如该向量中),这样可以在cmaster建议时允许mmap

    换句话说,你可以“升级”boost序列化实现,将数据从boost序列化迁移到原始二进制格式,直接在映射内存中使用它。

答案 1 :(得分:0)

您可以使用mmap()将文件映射到您的地址空间。有了这个,文件太大并不重要,因为内核知道映射区域中的任何数据只是硬盘上文件的副本。因此,它甚至不需要在需要内存时将数据交换出去。当你触摸它们时,内核会懒得加载你需要的文件部分,如果你不需要文件中的所有内容,那就特别好。

关于mmap()的好处是你可以将整个文件内容作为一个巨大的char数组访问,这对很多用例非常方便。必须满足的唯一前提条件是您的进程以64位进程运行,否则您的虚拟地址空间将太小而无法将文件放入其中。