提高XML解析器的RAM消耗

时间:2015-08-22 07:03:43

标签: xml boost xml-parsing boost-propertytree

我决定使用这段代码检查PropertyTree的内存使用情况以进行XML解析。 XML有超过120M的东西,但是当我决定杀掉它时,这个程序耗费了2G以上。这是PropertyTree的标准消费还是有问题?

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/foreach.hpp>
#include <iostream>

int main()
{
  using boost::property_tree::ptree;
  ptree pt;
  read_xml("c.xml",pt);
  return 0;
}

1 个答案:

答案 0 :(得分:3)

在64位Linux上运行使用Gcc 4.8编译的确切片段,并使用117MiB input xml here,我获得2.1 GiB的峰值内存使用率:

enter image description here

整个事情在~4-14s内执行,具体取决于优化标志。使用tcmalloc我们甚至可以获得2.7秒。

您可以看到至少50%的内存直接位于ptree容器中。在你的PHP问题中,你(正确地)提到将它全部读入一个DOM并不是一个好主意。

即便如此,如果使用a more appropriate/capable library, like PugiXML,执行速度也会超过10倍,内存使用率大约是1/6:

enter image description here

以下是代码:

#include <pugixml.hpp>
#include <iostream>

int main() {
    pugi::xml_document doc;
    doc.load_file("input.xml");
}

想象一下,如果使用流API优化内存使用情况会发生什么。