我决定使用这段代码检查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;
}
答案 0 :(得分:3)
在64位Linux上运行使用Gcc 4.8编译的确切片段,并使用117MiB input xml here,我获得2.1 GiB的峰值内存使用率:
整个事情在~4-14s内执行,具体取决于优化标志。使用tcmalloc我们甚至可以获得2.7秒。
您可以看到至少50%的内存直接位于ptree
容器中。在你的PHP问题中,你(正确地)提到将它全部读入一个DOM并不是一个好主意。
即便如此,如果使用a more appropriate/capable library, like PugiXML,执行速度也会超过10倍,内存使用率大约是1/6:
以下是代码:
#include <pugixml.hpp>
#include <iostream>
int main() {
pugi::xml_document doc;
doc.load_file("input.xml");
}
想象一下,如果使用流API优化内存使用情况会发生什么。