我有以下问题。我设置了一个camel -project来解析某些xml文件。我必须从文件中选择取出某些节点。
我有两个文件246 in和347 in的大小。在上面给出的例子中,我正在提取250个节点的父子对。
有了默认工厂,这里就是时代了。对于246 106文件respt 77秒和106秒。我想提高性能,因此切换到撒克逊和时间如下,47秒和54秒。我至少把时间缩短了一半。
是否有可能进一步缩短时间,我可以使用的任何其他工厂或优化将不胜感激。
我正在使用XpathBuilder来切断x路径。下面是一个例子。如果不需要重复创建XpathBuilder,似乎必须为每个xpath构建它,我将有一个实例并不断地将xpath注入其中,也许它将进一步提高性能。
return XPathBuilder.xpath(nodeXpath)
.saxon()
.namespace(Consts.XPATH_PREFIX, nameSpace)
.evaluate(exchange.getContext(), exchange.getIn().getBody(String.class), String.class);根据Michael的评论添加更多细节。所以我加入了他们的行列,下面我的例子会变得很清楚。我要把他们合而为一。因此,我们开始,让我们说,我们有下面的第一和第二路径映射。
bm:Document/bm:xxxxx/bm:PmtInf{0}/bm:ReqdExctnDt/text() pData.tinf.pIdentifi.instId://bm:Document/bm:xxxxx/bm:PmtInf{0}/bm:CdtTrfTxInf{1}/bm:PmtId/bm:InstrId/text():pData.tinf.rexd
这将导致如下所示的json
pData:{
tinf: {
rexd: <value_from_xml>
}
pIdentifi:{
instId: <value_from_xml>
}
}发布于 2019-11-29 12:01:39
实际上,我能把时间缩短到10秒。我用的是阿帕奇骆驼。因此,我在那里添加了线程,以便可以在单独的线程中读取多个文件。读取文件后,它将根据必须遍历的节点的长度进行串行操作。我意识到这里没有必要是串行的,所以介绍了parrallelStream,现在这给了它足够的能量。再次保护线程的一件事是不要有大量的线程,因为这会降低性能。因此,我试图将线程数量限制在两倍或三倍于操作机器上的核心数量。
发布于 2019-11-26 01:02:53
很难说,如果没有看到实际的XPath表达式,但考虑到文件大小和执行时间,我猜您正在执行一个join,它是作为笛卡尔产品天真地执行的,即具有O(n*m)性能。也许有某种方法来重组它,使其具有对数性能,但关键在于细节。Saxon非常擅长自动优化连接查询;如果不是,通常有手动实现的方法--尽管XSLT提供了比XPath更多的选项(例如使用xsl:key或xsl:merge)。
https://stackoverflow.com/questions/59039219
复制相似问题