正如主题所示,在将大量数据序列化到文件时,我遇到了 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、文本、xml 到最后的多态二进制/xml/文本。其中每一个的行为方式都完全相同。
通常,如果我必须序列化少量数据,那么这不会成为问题,但我拥有的类数量为数百万(理想情况下约为 1000 万),并且我能够测试的内存使用情况始终表明写入文件时,代码的 boost::serialization 部分分配的内存大约占应用程序整个内存占用量的 2/3。
这相当于 400 万个对象占用约 13.5 GB 的 RAM,其中对象本身占用 4.2 GB。现在这就是我所能获取的代码,因为我无法访问具有超过 8GB 物理 RAM 的机器。我还应该注意到,这是一个在 Windows 7 专业版 x64 版本上运行的 64 位应用程序,但在 Ubuntu 机器上情况类似。
任何人都知道我将如何解决此问题,因为对于我来说,对于一个应用程序有如此高的内存要求,而该应用程序在运行时不会像序列化时那样使用那么多内存,这是不可接受的。
反序列化并没有那么糟糕,因为它分配的内存大约是所需内存的 1.5 倍。这是我可以忍受的。
尝试使用 boost::archive::archive_flags::no_tracking 关闭跟踪,但其行为完全相同。
有人知道我应该做什么吗?
使用 valgrind 我发现内存消耗的主要原因是库内用于跟踪指针的映射。如果您确定不需要指针跟踪(这意味着您确定没有指针别名),请禁用跟踪。你可以找到here http://www.boost.org/doc/libs/1_35_0/libs/serialization/doc/traits.html#tracking禁用跟踪的主要概念。简而言之,你必须做这样的事情:
BOOST_CLASS_TRACKING(vector<vector<vector<MyBase*> > >, boost::serialization::track_never)
In 我的问题 https://stackoverflow.com/questions/35391792/set-tracking-traits-of-template-class-in-boost-serialization-to-reduce-memory-co我编写了这个宏的一个版本,您可以禁用对模板类的跟踪。这一定会对您的内存消耗产生重大影响。
另请注意,任何容器内都有指针,如果您不想跟踪,则也必须禁用对它们的跟踪。目前我找不到任何方法来正确执行此操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)