提高 XML 解析器 RAM 消耗
Boost XML parser RAM consumption
我决定检查 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;
}
运行 您使用 Gcc 4.8 在 64 位 linux 上编译的确切片段,并使用 117MiB input xml here,我得到 2.1 GiB 的峰值内存使用量:
根据优化标志,整个过程将在 ~4-14 秒内执行。使用 tcmalloc 我们甚至可以得到 2.7s。
您可以看到至少 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。
我决定检查 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;
}
运行 您使用 Gcc 4.8 在 64 位 linux 上编译的确切片段,并使用 117MiB input xml here,我得到 2.1 GiB 的峰值内存使用量:
根据优化标志,整个过程将在 ~4-14 秒内执行。使用 tcmalloc 我们甚至可以得到 2.7s。
您可以看到至少 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。