什么是最有效的基于Java流XSLT处理器?[关闭]
题
我有一个很大的XML文件,该文件我需要转换成另一种XML文件,我想这样做与XSLT。我更感兴趣的优化用于存储,而不是优化速度(虽然速度将是很好的也是!)。
它基于Java XSLT processor你会recommmend为这项任务?
你会推荐任何其他方法(非XSLT?, 非Java?), 如果是,为什么?
在XML文件的问题是非常大的,但不是很深数以百万计的行(元件),但只有大约3级别的深度。
解决方案
目前只有三个 XSLT2.0 处理已知的 并从他们 撒克逊9.x 可能是最有效的(至少根据我的经验)在速度和存储利用。 萨克森-SA (该模式的了解版本的撒克逊人,并不免费,因为B(基本)版本)具有特殊的扩展流行处理。
从现有的各种 XSLT1.0 处理器.净 XslCompiledTransform (C#-根据,不Java!) 似乎是冠军。
在Java为基础的世界的XSLT1.0处理器 撒克逊6.x 又是漂亮的好。
更新:
现在,超过3年,从该日期这一问题最初是回答说,没有任何证据表明,效率之间的差异的XSLT提到的处理器已经改变。
如流:
- XML文件"数以百万计的节点"很可能是处理,即使没有任何流.我进行了一项实验中,Saxom9.1.07处理XML文件,包含大约一百万3-rd级别的元素与整数值。转变简单地计算它们的总和。总时间的变换我的电脑上小于1.5秒钟。所使用的存储器是500兆-这电脑有可能甚至10年前,
这是撒克逊人的信息,显示信息有关的转变:
Saxon 9.1.0.7J from Saxonica Java version 1.6.0_17 Stylesheet compilation time: 190 milliseconds Processing file:/C:\temp\delete\MRowst.xml Building tree for file:/C:\temp\delete\MRowst.xml using class net.sf.saxon.tinytree.TinyBuilder Tree built in 1053 milliseconds Tree size: 3075004 nodes, 1800000 characters, 0 attributes Loading net.sf.saxon.event.MessageEmitter Execution time: 1448 milliseconds Memory used: 506661648 NamePool contents: 14 entries in 14 chains. 6 prefixes, 6 URIs
- 撒克逊9.4有 一个 撒克逊:流()扩大功能 可用于处理巨大的XML文件。
这里是一个摘录的文件:
基本上有两种方法的做流在撒克逊:
突发的模流:这种方法,改造 大文件被分成了一个序列的转变小 碎片的文件。每一片又是从输入,转身 进一个小树存、转化,并将其写入输出 文件。
这种方法很有效的文件相当平的结构, 例如一个录文件保持数以百万计的日志记录,那里的 处理的每个日志记录是独立的那个去 之前。
一个变这种技术的使用new XSLT3.0xsl:迭代 指令迭代的记录,在地方xsl:为每个。这使得工作的数据可以保持记录 处理:这使得它可能的,例如,输出总额或 平均在运行结束时,或者使该处理的一个 记录的依赖什么来之前它在该文件。Xsl:迭代 指令还允许早退出的循环中,这使得它 可能转变到数据的过程从开始 大的文件没有实际阅读整个文件。
突发的模流提供XSLT和属,但是有 没有相当于在属于xsl:迭代结构。
流模板:这种做法遵循传统XSLT 处理模式的执行递归下降输入XML 层级的模板匹配规则,以节点在每个级别,但是 这样做的一个元素在一段时间,没有建树,在存储器。
每一个模板属于一个模式(可能是默认的、无名的模式), 和流产的模式,可以指定的使用 新xsl:模式的宣言》。如果该模式是宣布 可流传送,那么每个模板的规则内的这一模式必须服从 规则对于可流传送处理。
该规则对于什么是允许在流处理是相当 复杂的,但基本原则是,该模板的规则 给定的一个节点可以只读取的后代,节点一次, 顺序。有另外的规则所施加的限制在目前的 撒克逊的执行情况:例如,虽然分组使用 理论上是一致的 与一流实施,它目前不实施 撒克逊人。
其他提示
请参阅用于流模式撒克逊支持。 http://www.saxonica.com/html/documentation/sourcedocs/streaming/
如果这种流模式是不适合你,你可以尝试使用撒克逊的微小的树模式,这是对于较小的内存使用情况进行优化。 (这是默认反正)