Java中的内存高效XML操作

时间:2012-06-18 19:32:32

标签: java dom sax

我们正在实施一个具有两个后端组件的事务系统:

  • 组件A生成初始XML响应
  • 组件B修改初始响应XML

生成的XML将发送回请求者。由于我们可能在高负载下执行此操作,因此我希望以非常高效的CPU /内存方式执行此操作。

在保持对整体内存利用率的严格限制的同时执行上述操作的最佳方法是什么?

具体来说,最好是对组件A的输出进行DOM解析并将其传递给组件B以在内存中进行修改?有没有更好的方法来使用SAX来实现这一点,这可能更节省内存?是否有通过SAX或DOM执行此操作的标准库?

感谢您的任何见解。

-Raj

3 个答案:

答案 0 :(得分:3)

通常,SAX比DOM更具内存效率,因为整个文档不需要加载到内存中进行处理。但是,答案取决于“组件B修改初始响应XML”要求的具体细节。

  • 如果每个更改都是其自己的XML子树的本地更改(即,您可能需要来自通向树根但不是兄弟节点的所有节点的数据),SAX将更好地工作。
  • 如果更改需要引用兄弟节点来生成结果,那么DOM将更好地工作,因为它可以让您避免构建自己的数据结构来存储兄弟姐妹。

答案 1 :(得分:1)

组件B上的一个方面或过滤器将XSL-T转换应用于初始XML响应可能是一种完成它的干净方法。内存利用率取决于请求的大小和内存中的实例数。 CPU也将依赖于这两个因素。

DOM要求在修改之前将整个XML文档驻留在内存中。如果它只是一些必须改变的元素,那么SAX是一个很好的选择。

答案 2 :(得分:0)

SAX是一个基于事件的解析实用程序。您将收到有关诸如beginDocument(),startElement(),endElement()等事件的通知。您可以在内存中保存要保存的内容。您只能控制所需的事件,这可以真正提高解析速度并减少内存使用。 可以是内存效率,具体取决于您在内存中保存的内容和内容。对于一般情况,SAX比DOM更具内存效率。 DOM会将整个文档保存在内存中以便进行处理。