正如主题建议我在将大量数据序列化到文件时遇到了与boost :: serialization有关的小问题。问题在于应用程序序列化部分的内存占用量大约是被序列化对象内存的3到3.5倍。
值得注意的是,我所拥有的数据结构是基类指针的三维向量和指向该结构的指针。像这样:
using namespace std;
vector<vector<vector<MyBase*> > >* data;
稍后使用与此类似的代码序列化:
ar & BOOST_SERIALIZATION_NVP(data);
包括boost / serialization / vector.hpp。
被序列化的类都继承自“MyBase”
现在,从我的项目开始,我已经使用不同的档案从典型的binary_archive,text,xml和最后的多态二进制/ xml /文本进行序列化。这些行为中的每一个都完全相同。
通常情况下,如果我必须序列化少量数据,但我所拥有的类数量达到数百万(理想情况下大约为10亿),并且我已经能够测试它的内存使用率一直显示在编写文件时,代码的boost :: serialization部分分配的内存大约占应用程序整个内存占用量的2/3。
这相当于大约13.5 GB的RAM用于4百万个对象,其中对象本身需要4.2GB。现在这是因为我无法访问具有超过8GB物理RAM的计算机,因此我可以使用我的代码。我还应该注意,这是一个64位应用程序,在Windows 7专业版x64版本上运行,但在Ubuntu盒子上的情况类似。
任何人都知道我将如何对此进行故障排除,因为对于一个应用程序具有如此高的内存要求是不可接受的,该应用程序在运行时不会像在序列化时那样使用尽可能多的内存。
反序列化并不是那么糟糕,因为它分配的内存大约是所需内存的1.5倍。这是我可以忍受的。
尝试使用boost :: archive :: archive_flags :: no_tracking来关闭跟踪,但它的行为完全相同。
任何人都知道我应该做什么?
答案 0 :(得分:1)
使用valgrind我发现内存消耗的主要原因是库内的一个映射来跟踪指针。如果您确定不需要指针跟踪(这意味着您确定没有指针别名)禁用跟踪。您可以找到here禁用跟踪的主要概念。总之,你必须做这样的事情:
BOOST_CLASS_TRACKING(vector<vector<vector<MyBase*> > >, boost::serialization::track_never)
在my question中,我编写了此宏的一个版本,您可以禁用对模板类的跟踪。这必然会对您的内存消耗产生重大影响。 另请注意,任何容器内都有指针如果您想要跟踪,您也必须禁用它们的跟踪。目前我找不到任何正确的方法。