我有以下问题。我设置了一个camel -project来解析某些xml文件。我必须选择从文件中取出某些节点。
我有两个文件,分别为246kb和347kb。在上面给出的示例中,我提取了250个节点的父子对。
使用默认工厂,这里是时间。对于246kb文件,分别保留77秒和106秒。我想提高性能,因此改用saxon,时间分别为47秒和54秒。我至少可以减少一半的时间。
是否可以进一步缩短时间,我可以使用任何其他工厂或优化方法。
我正在使用XpathBuilder剪切xpath。这是一个例子。是否有可能不必重复创建XpathBuilder,似乎必须为每个xpath构造它,我将拥有一个实例并不断将xpath注入其中,也许它将进一步提高性能。
return XPathBuilder.xpath(nodeXpath)
.saxon()
.namespace(Consts.XPATH_PREFIX, nameSpace)
.evaluate(exchange.getContext(), exchange.getIn().getBody(String.class), String.class);
根据迈克尔的评论添加更多详细信息。所以我很喜欢加入他们,下面的例子将使我变得很清楚。我将它们组合成一个json。 所以我们开始吧,假设我们在第一条路径和第二条路径上有以下映射。
pData.tinf.rexd: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()
这将导致如下所示的json
pData:{
tinf: {
rexd: <value_from_xml>
}
pIdentifi:{
instId: <value_from_xml>
}
}
答案 0 :(得分:0)
无需说出实际的XPath表达式就很难说,但是鉴于文件的大小和执行时间,我的猜测是您正在做一个联接,该联接被作为笛卡尔积天真地执行,即使用O(n * m)性能。可能有一些重新组织它以具有对数性能的方法,但是细节在于细节。 Saxon-EE非常擅长自动优化联接查询。如果不是这样,通常会有手动的方法-尽管XSLT为您提供了比XPath更多的选择(例如,使用xsl:key
或xsl:merge
)。
答案 1 :(得分:0)
实际上,我能够将时间缩短到10秒。我正在使用apache-camel。因此,我在此处添加了线程,以便可以在单独的线程中读取多个文件。读取文件后,它会根据必须遍历的节点的长度进行串行操作。我意识到不必在这里进行串行化,因此引入了parrallelStream,现在它具有足够的功能。谨防再次发生的一件事是不要增加线程数量,因为那样会降低性能。因此,我尝试将线程数限制为操作系统上的内核数的两倍或三倍。