Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing ApacheXpathBuilder性能_Parsing_Xpath_Apache Camel_Saxon - Fatal编程技术网

Parsing ApacheXpathBuilder性能

Parsing ApacheXpathBuilder性能,parsing,xpath,apache-camel,saxon,Parsing,Xpath,Apache Camel,Saxon,我有以下问题。我设置了一个camel项目来解析某些xml文件。我必须选择从文件中取出某些节点 我有两个246kb和347kb大小的文件。在上面给出的示例中,我正在提取250个节点的父子对 对于默认工厂,这里是时间。对于246kb的文件,分别为77秒和106秒。我想提高性能,所以切换到saxon,时间如下47秒和54秒。我至少把时间缩短了一半 如果有可能进一步缩短时间,任何其他工厂或优化我可以使用将不胜感激 我正在使用XpathBuilder删除XPath。这里有一个例子。有没有可能不必重复创建X

我有以下问题。我设置了一个camel项目来解析某些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);
根据Michael的评论添加更多细节。所以我加入了他们,下面的例子会让我明白。我正在将它们组合成一个json。 现在我们开始,假设第一条和第二条路径有以下映射

pData.tinf.rexd:bm:Document/bm:xxxxx/bm:PmtInf[{0}]/bm:reqdextndt/text() pData.tinf.pIdentifi.institd://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>
}
}
pData:{
tinf:{
雷克斯德:
}
皮登蒂菲:{
灌输:
}
}

如果看不到实际的XPath表达式,很难说,但是考虑到文件大小和执行时间,我的猜测是,您正在执行一个连接,该连接以笛卡尔乘积的形式天真地执行,即具有O(n*m)性能。也许有某种方法可以重新组织它,使其具有对数性能,但问题在于细节。Saxon EE非常擅长自动优化连接查询;如果没有,通常会有手动操作的方法——尽管XSLT比XPath提供了更多的选项(例如使用
xsl:key
xsl:merge
)。

实际上我可以将时间缩短到10秒。我正在使用apachecamel。所以我在那里添加了线程,以便可以在单独的线程中读取多个文件。一旦文件被读取,它就可以根据需要遍历的节点的长度进行串行操作。我意识到这里没有必要是串行的,所以引入了ParralleStream,这给了它足够的动力。保护agains的一件事是不要让线程大量增加,因为这会降低性能。因此,我尝试将线程数量限制为操作机器上内核数量的两倍或三倍。

这里有两个我正在使用的xml路径,第一个从父级获取值,第二个从子级获取值。假设我们有两个父母。第一个家长有250个孩子,另一个家长有50个。然后我将准备300个单独的xml标记。父级
//bm:Document/bm:xxxxx/bm:PmtInf[{0}]/bm:reqdextndt/text()`//bm:Document/bm:xxxxx/bm:PmtInf[{0}]/bm:CdtTrfTxInf[{1}]/bm:PmtId/bm:InstrId/text()
所以您要执行两个单独的XPath查询来检索两个节点集,然后在调用应用程序中比较/加入它们?路径很简单——重要的是你如何处理结果。