首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Java的最高效的流式XSLT处理器是什么?

基于Java的最高效的流式XSLT处理器是什么?
EN

Stack Overflow用户
提问于 2009-01-20 11:26:46
回答 3查看 18.2K关注 0票数 28

我有一个非常大的XML文件,需要将其转换为另一个XML文件,我希望使用XSLT来完成此任务。我更感兴趣的是内存的优化,而不是速度的优化(当然,速度也很好!)

对于这项任务,您推荐使用哪种基于Java的XSLT处理器?

您是否建议使用其他方法(非XSLT、非Java?),如果有,为什么?

问题中的XML文件非常大,但不是很深-有数百万行(元素),但只有大约3层深。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-20 15:03:47

目前已知的 处理器只有三种,其中在速度和内存利用率方面可能是最高效的(至少根据我的经验)。 (支持模式的Saxon版本,不像B (basic)版本那样免费)为流处理提供了特殊的扩展。

来自各种现有的 处理器,.NET (基于C#,而不是Java!)看起来是冠军。

在基于Java的XSLT1.0处理器世界中, 也是相当不错的。

更新

现在,距离最初回答这个问题已经有3年多的时间了,没有任何证据表明所提到的XSLT处理器之间的效率差异已经改变。

用于流式As

即使没有任何流,也可以很好地处理具有“数百万个节点”的XML文档。我进行了一个实验,在这个实验中,Saxom 9.1.07处理了一个XML文档,其中包含大约一百万个具有整数值的第三级元素。转换只是计算它们的总和。在我的计算机上转换的总时间不到1.5秒。使用的内存是500MB --这是10年前PC可能拥有的内存,

以下是Saxon的信息性消息,其中显示了有关转换的详细信息:

来自Saxonica Java版本的

Saxon 9.1.0.7J 1.6.0_17样式表编译时间: 190毫秒处理文件:/C:\temp\delete\MRowst.xml构建文件的树:/C:\temp\delete\MRowst.xml使用类net.sf.saxon.tinytree.TinyBuilder树1053毫秒内置树大小: 3075004节点,1800000个字符,0属性加载net.sf.saxon.event.MessageEmitter执行时间: 1448毫秒内存使用: 506661648 NamePool内容: 14个链中的14个条目。6个前缀,6个URI

XML9.4有一个 ,可以用来处理巨大的

  1. Saxon文档。

此处是文档的摘录

在Saxon中有两种基本的流式传输方式:

突发模式流:使用这种方法,大文件的转换被分解为文件小片段的一系列转换。依次从输入读取每个片段,将其转换为内存中的一棵小树,然后将其转换并写入输出文件。

这种方法适用于结构相当平坦的文件,例如,包含数百万条日志记录的日志文件,其中每个日志记录的处理独立于之前的日志记录。

该技术的一个变体使用新的XSLT3.0xsl: iterate指令来迭代记录,而不是xsl:for-each。这允许在处理记录时维护工作数据:例如,这使得可以在运行结束时输出总计或平均值,或者使一条记录的处理依赖于文件中之前的记录。iterate指令还允许提前退出循环,这使得转换可以从大文件的开头处理数据,而无需实际读取整个文件。

突发模式流在XSLT和XQuery中都可用,但是在XQuery中没有与xsl:iterate构造等价的东西。

流模板:这种方法遵循传统的XSLT处理模式,即通过将模板规则与每个级别的节点进行匹配来执行输入XML层次结构的递归下降,但每次只处理一个元素,而不在内存中构建树。

每个模板都属于一个模式(可能是默认的、未命名的模式),流是该模式的一个属性,可以使用新的xsl:mode声明指定该属性。如果该模式被声明为streamable,那么该模式中的每个模板规则都必须遵守streamable处理的规则。

流处理中允许的规则相当复杂,但基本原则是给定节点的模板规则只能按顺序读取该节点的后代一次。当前Saxon实现中的限制还强加了其他规则:例如,尽管使用分组与流式实现在理论上是一致的,但它目前还没有在Saxon中实现。

  1. 会有标准的 。但是,W3C文档仍处于“工作草案”状态,流规范可能会在后续的草案版本中发生变化。因此,当前草案(流)规范的实现exist.
  2. Warning:不是每个转换都可以在流模式下执行--与XSLT处理器无关。对于大型文档,无法在流模式(内存有限)下执行转换的一个示例是对它们的元素进行排序(比如按公共属性排序)。
票数 34
EN

Stack Overflow用户

发布于 2009-01-20 11:32:31

您可以考虑STX,它的Java实现是Joost。因为它类似于XSLT,但是作为一个流处理器,它能够使用非常少的RAM处理大量文件。

Joost可以作为标准的javax.xml.transform.TransformerFactory使用

票数 9
EN

Stack Overflow用户

发布于 2009-01-20 11:30:23

请参阅Saxon对流模式的支持。http://www.saxonica.com/html/documentation/sourcedocs/streaming/

如果这种流模式不适合您,您可以尝试使用Saxon的tiny tree mode,它针对较小的内存使用进行了优化。(这无论如何都是默认的)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/460895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档