提高 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。