代码之家  ›  专栏  ›  技术社区  ›  Robert Strauch

用DOM解析XML时的最大大小

  •  6
  • Robert Strauch  · 技术社区  · 14 年前

    目前我正在实现一个REST客户端,它将解析XML响应消息。稍后,它将在Android设备上运行。因此,内存和处理速度是一个相当大的问题。但是,一次只能有一个XML响应,因此一次处理或保存多个XML文档不成问题。

    据我所知,使用Android SDK解析XML有三种方法:

    • 萨克斯
    • XmlPullParser分析器
    • 多姆

    在阅读这些不同的解析方法时,我发现对于大型XML文件,建议使用SAX,因为它不像DOM那样在内存中保存完整的树。

    然而,我在问自己什么是大的千字节,兆字节。。。?是否有一个实际的大小,它不真正重要是使用SAX还是DOM?

    谢谢,
    罗伯特

    3 回复  |  直到 14 年前
        1
  •  9
  •   James Anderson    14 年前

    没有为XML文档或DOM大小设置标准限制,因此这完全取决于主机可以处理什么。

    当你在Android上实现的时候,你应该假设一个相当有限的内存,记住DOM、XML解析器、你的程序逻辑、显示逻辑、JVM和Android本身都必须放在可用的内存中!.

    根据经验,可以预期DOM占用的内存大约是源XML文档大小的四倍。因此,假设512MB的可用内存,目标不超过一半的这一点为DOM,你最终得到512/8或实际最大的64 MB的XML文档。

    为了安全起见,我会再次将其减半到最大32MB。因此,如果您希望有许多这样大小的文档,我会切换到SAX解析!.

    如果您希望应用程序以任何速度响应大型文档,那么SAX就是一种方法。SAX解析器可以在第一个元素被读取后立即返回结果,DOM解析器需要在将任何输出发送到程序之前读取整个文档。

        2
  •  4
  •   darvids0n    14 年前

    摘自 this article :

    DOM解析器内存膨胀。对于较小的XML集,这不是一个问题,但是随着XML大小的增长,DOM解析器的效率越来越低,这使得它们在增长XML时不太可伸缩。推送解析器是一种很好的媒介,因为它们允许您控制解析,从而消除了任何复杂的状态管理,因为状态总是已知的,而且它们不受DOM解析器内存膨胀的影响。

    这可能是建议使用SAX而不是DOM:SAX函数作为XML推送解析器的原因。另外,查看Wikipedia上关于SAX的文章 here .

    编辑:要明确地解决大小问题,您必须查看您的实现。DOM的一个例子 Document 基于Java的XML解析器内存中的对象大小是 here . Java和许多语言一样,定义了一些基于内存的限制,比如 JVM heap size ,Android web服务/XML DOM API还可以根据程序员的判断定义一些内部限制(在 here ). 对于最大允许尺寸没有一个明确的答案。

        3
  •  1
  •   mauretto    14 年前

    我的经验告诉我,使用DOM的内存是文件大小的两倍,但这当然只是一个指示。如果XML树只有一个包含整个数据的字段,那么使用的内存与文件大小类似!