更快的多重解析:SAX 或 DOM

Posted

技术标签:

【中文标题】更快的多重解析:SAX 或 DOM【英文标题】:faster multiple parsings : SAX or DOM 【发布时间】:2013-09-03 20:53:28 【问题描述】:

我读过很多帖子说 SAX 比 DOM 快。我不确定我的问题是否愚蠢,但我认为如果我们有巨大的内存,DOM 必须更快。因为一旦将树结构加载到内存中,它应该比 SAX 更快。

我在这里需要一些澄清,请帮助我理解。 我有一个用例,我每天都会收到一个要解析多次的大文件。 我可以说 DOM 在第一次解析时可能会比 SAX 慢一点,并且所有后续解析在 DOM 的情况下会非常快,因为它将整个文档结构加载到内存中并重用它。如果是这样,那我们怎么能说 SAX 比 DOM 快。如果我错了,请纠正我。 如果明天我更改我的 XSD 并需要将新结构推送到内存中,那么有没有办法在不重新启动应用程序的情况下做到这一点。

【问题讨论】:

【参考方案1】:

我们在以下情况下使用 SAX:

    我们该死的确定,只需通过文件一次就足够了。顺便说一句,大多数时候都是这样。执行多次传递或返回/转发指针的代码大多数时候可以重构为一次传递。

    当我们通过某些流媒体渠道(例如通过网络)接收 xml 文件时,我们可能希望在整个文件完全下载之前进行实时读取。 SAX 可以处理部分下载的文件,DOM 不能。

    当我们对 XML 中的特定位置感兴趣时,而不是对完整文档感兴趣。例如,Atom Feed 最适合 SAX,但要分析 WSDL,您将需要 DOM。

我们在以下情况下使用 DOM:

    好吧,当单次通过时不行。我们需要在文件中上下移动。

    当 XML 在磁盘上并且我们不需要实时读数时。我们可以慢慢来,加载 它,阅读它,分析它,然后得出结论。

    当你的老板要求在午餐前做,而你不打扰质量。

现在回答你的问题

您提供了:

    你有一个巨大的文件:........SAX +1 解析多次:.....DOM +1

两者都获得相同的选票。将您现有的知识库添加到其中。 (熟悉 SAX?)。巨大有多大?您所说的 XML 和内存都很大。即使是 100MB 的文件也没什么大不了的。 DOM 可以处理它。您需要每天解析多次。如果一个操作在几分钟内完成,那么将数据保留在内存中接下来的几个小时似乎并不明智。在这种情况下,您将失去 DOM 的好处。但是如果一个操作本身需要一个小时,那么您保留预处理信息是完全正确的。

正如我所指出的,您没有提供足够的统计数据。统计数据大小、内存大小、DOM 中的加载时间、处理时间,您一天究竟需要多少次?您的机器在此期间做什么?闲置或分析其他此类文件?

获取这些统计信息。要么在这里发布,要么自己分析它们,你就会得出结论。

【讨论】:

如果这一切看起来太过分了,那就去 DOM。 谢谢。文件大小约为 6-7 mb. 一天三次。我们被要求在性能上给予最高优先级。但我仍然不清楚如果我们有足够的内存并且一旦第一次完成解析,那么对于所有后续解析 SAX 如何获得平等票数。 如果DOM在加载到内存后不重用文档结构,请纠正我 @Johnn,请统计一下。做一次。在 DOM 中加载您的 xml 并执行一些基本操作,获取一些您感兴趣的值。您现在不需要编写整个程序。只是一个基本骨架。看看需要多长时间。如果花费的时间超过几分钟,那么您需要查看 SAX,但低于该 SAX 将是矫枉过正。如果您有足够的时间,请继续使用 SAX 进行类似的实验。统计数据应该告诉你。不是我也不是其他人。 DOM 确实会在将文档结构加载到内存后重用它。但是那个结构占据了空间。 DOM 文档的内存占用大约是磁盘大小的三倍。您必须整天占用 7x3=21 MB 的内存。现在,如果您的机器碰巧解析了更多这样的文档,它很快就会爬网。每次需要时花费一些 cpu 并重新生成该结构会更明智。内存开销远远超过 CPU 开销。

以上是关于更快的多重解析:SAX 或 DOM的主要内容,如果未能解决你的问题,请参考以下文章

Android:DOM vs SAX vs XMLPullParser 解析?

sax的解析原理基础

为啥 sax 解析比 dom 解析快?以及 stax 是如何工作的?

如何在 android 中使用 DOM 或 SAX 解析器从 XML 读取子节点

XML.03-DOM和SAX解析

SAX解析