我使用二进制文件使用boost::binary_iarchive_ia
恢复对象,但它太重(18GB)并且该对象将整个文件加载到内存中。有没有办法按部分读取文件(延迟加载)以避免内存使用?
我有什么:
std::ifstream ifs(filename);
boost::archive::binary_iarchive_ia(ifs);
MyObject obj;
ia >> obj;
答案 0 :(得分:1)
将我的评论升级为答案:
原始文件从来都不是问题(它一直在流式传输)。
问题在于反序列化试图将数据全部存储在内存中(例如,向量)。所以唯一真正的解决方案是
是将此数据放入(共享?)内存映射中。您可以使用Boost Interprocess中的分配器来帮助您实现此目的。这是一项很大的努力,但在概念上相对简单。
可以修改反序列化代码以便即时转换为不同的磁盘格式(而不是插入到例如该向量中),这样可以在cmaster建议时允许mmap
。
换句话说,你可以“升级”boost序列化实现,将数据从boost序列化迁移到原始二进制格式,直接在映射内存中使用它。
答案 1 :(得分:0)
您可以使用mmap()
将文件映射到您的地址空间。有了这个,文件太大并不重要,因为内核知道映射区域中的任何数据只是硬盘上文件的副本。因此,它甚至不需要在需要内存时将数据交换出去。当你触摸它们时,内核会懒得加载你需要的文件部分,如果你不需要文件中的所有内容,那就特别好。
关于mmap()
的好处是你可以将整个文件内容作为一个巨大的char
数组访问,这对很多用例非常方便。必须满足的唯一前提条件是您的进程以64位进程运行,否则您的虚拟地址空间将太小而无法将文件放入其中。