提高 XML 解析器 RAM 消耗

Posted

技术标签:

【中文标题】提高 XML 解析器 RAM 消耗【英文标题】:Boost XML parser RAM consumption 【发布时间】:2015-08-22 07:03:43 【问题描述】:

我决定使用这段代码检查用于 XML 解析的 PropertyTree 的内存使用情况。 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;

【问题讨论】:

您有示例 XML 吗? (事不宜迟:我猜这很正常。Boost Property Tree 不是 XML 库。它是一个 property tree 库。这意味着它将“足够好”对于像应用程序这样的配置文件) 此处显示示例***.com/questions/29223415/… 这不是 120MB 的 XML。 【参考方案1】:

在 64 位 Linux 上运行使用 Gcc 4.8 编译的精确 sn-p,并使用 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 优化内存使用会发生什么。

【讨论】:

没错,当我尝试 RapidXML 时,我得到了大约 3.7 x 大小,使用 PugiXML 时它是 2.75x。 Boost 并不适合 XML 解析。

以上是关于提高 XML 解析器 RAM 消耗的主要内容,如果未能解决你的问题,请参考以下文章

Xml的转义字符--约束-xml解析器

Java 中是不是有比 Xalan/Xerces 更快的 XML 解析器 [关闭]

android中XML SAX解析器、Pull解析器和DOM解析器的区别

笔记:XML-解析文档-流机制解析器(SAXStAX)

PHP XML Expat 解析器

XML DOM 解析器