XML解析器/验证器的算法复杂性
我需要知道不同XML工具(解析器,验证器,XPath表达式评估器等)的性能如何受到输入文档的大小和复杂性的影响。那里是否有资源记录了CPU时间和内存使用如何受到……的影响,嗯?文档大小以字节为单位?节点数?关系是线性的,多项式的或者更差的吗?
更新
在2008年9月IEEE电脑杂志第41卷第9期的一篇文章中,作者调查了四种流行的XML解析模型(DOM,SAX,StAX和VTD)。他们运行了一些非常基本的性能测试,这些测试表明,当输入文件的大小从1-15 KB增加到1-15 MB或者大大约1000倍时,DOM分析器的吞吐量将减半。其他模型的吞吐量没有受到明显影响。
不幸的是,他们没有进行更详细的研究,例如吞吐量/内存使用量与节点数量/大小的关系。
文章在这里。
更新
我无法找到对此问题的任何正式处理。对于它的价值,我进行了一些实验,以XML文档大小(以字节为单位)的函数来测量XML文档中的节点数。我正在仓库管理系统上工作,而XML文档是典型的仓库文档,例如提前装运通知等
下图显示了字节大小与节点数之间的关系(在DOM模型下,该关系应与文档的内存占用量成正比)。不同的颜色对应于不同种类的文档。比例为对数/对数。黑线最适合蓝点。有趣的是,对于所有类型的文档,字节大小和节点大小之间的关系都是线性的,但是比例系数可能会非常不同。
解决方案
回答
如果我遇到了这个问题并且在Google上找不到任何东西,我可能会尝试自己动手做。
一些"信封背面"的东西可以让我们了解它的发展方向。但这有点需要我了解如何执行xml解析器。
对于非算法基准,请在此处查看:
- http://www.xml.com/pub/a/Benchmark/exec.html
- http://www.devx.com/xml/Article/16922
- http://xerces.apache.org/xerces2-j/faq-performance.html
回答
我认为,除非我们做出大量假设,否则涉及太多的变量才能得出简单的复杂性指标。
一个简单的SAX样式解析器在文档大小方面应该是线性的,并且在存储方面应该是平坦的。
由于XPath表达式的复杂性起着巨大的作用,因此仅凭输入文档就无法描述类似XPath的东西。
同样,对于模式验证,大型但简单的模式很可能是线性的,而结构复杂得多的较小的模式将显示较差的运行时性能。
与大多数性能问题一样,获得准确答案的唯一方法是对其进行衡量,然后看看会发生什么!
回答
罗伯·沃克(Rob Walker)是对的:没有足够详细地说明问题。仅考虑解析器(并忽略它们是否执行验证的问题),主要有两种:基于树的DOM和基于流/基于事件的思想SAX(推)和StAX(拉)。概括地说,基于树的方法消耗更多的内存,并且速度较慢(因为我们需要完成对整个文档的解析),而基于流/事件的方法消耗的内存更少,并且速度更快。基于树的解析器通常被认为更易于使用,尽管StAX被认为是对SAX的巨大改进(易于使用)。
回答
我打算在应用程序中加载非常大的XML文件。我在这里提出了有关堆栈溢出的问题:大型文档的最快可能XML处理。
是的,这是解析部分,这是瓶颈。
我最终根本不使用XML解析器。相反,我尽可能高效地对字符进行了逐一解析,以优化速度。这样,在3 GHz Windows PC上,读取,解析和加载内部数据结构的速度为每秒40 MB。
我很想听听各种XML解析模式与此相比。