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