我有一个程序可以解析约 50MB 的 XML 文件并将数据提取到内部对象结构中,而没有指向原始 XML 文件的链接。当我试图粗略估计我需要多少内存时,我估计是 40MB。
但我的程序需要 350MB 之类的空间,我试图找出发生了什么。我使用boost::shared_ptr
,所以我不处理原始指针,希望我没有产生内存泄漏。
我试着写我所做的,我希望有人能指出我的过程中的问题,错误的假设等等。
首先,我是如何测量的?我曾经htop
发现我的内存已满,使用我的代码的进程正在使用大部分内存。为了总结不同线程的内存并获得更漂亮的输出,我使用了http://www.pixelbeat.org/scripts/ps_mem.py这证实了我的观察。
我粗略地估计了理论消耗量,以了解哪个因素介于消耗量和至少应该是什么之间。是10。所以我用来valgrind --tool=massif
分析内存消耗。它表明,在 350MB 的峰值时,250MB 被xml_allocator
来自pugixml
库的称为的东西使用。我去了我的代码部分,我在其中实例化pugi::xml_document
并放入std::cout
对象的析构函数以确认它已被释放,这发生在我的程序的早期(最后我睡了 20 秒,以便有足够的时间来测量内存消耗,即使在析构函数的控制台输出出现后仍保持 350MB)。
现在我不知道如何解释这一点,并希望有人能在我做出错误假设或类似假设的地方帮助我。
最外面的代码片段使用pugixml
类似于:
void parse( std::string filename, my_data_structure& struc )
{
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file(filename.c_str());
for (pugi::xml_node node = doc.child("foo").child("bar"); node; node = node.next_sibling("bar"))
{
struc.hams.push_back( node.attribute("ham").value() );
}
}
而且由于在我的代码中我没有在pugixml
某处存储元素(只有从中提取的实际值),所以我doc
希望在离开函数时释放所有资源parse
,但是在图表上看,我不知道在哪里(在时间轴上) 有时候是这样的。