如何大幅提高xsltproc命令的速度?



这是我的XML数据的格式:

<?xml version="1.0" encoding="utf-8"?>
<rowdata>
<row Id="1" type="1" data="text" ... />
<row Id="2" type="2" data="text" parent="1" ... />
<row Id="3" type="1" data="text" ... />
<row Id="4" type="1" data="text" ... />
<row Id="5" type="2" data="text" parent="4" ... />
...

这是我的 XSL 工作表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*" />
<xsl:template match="/rowdata">
<xsl:for-each select="row">
<xsl:if test="@Id = 10000">
<xsl:value-of select="@data"/><xsl:text>&#xa;</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

事实:

  1. 我无法更改 XML 数据
  2. 我可以更改 XSL 工作表
  3. XML 数据中有许多行
  4. for-each 选择器只能匹配一行

问题:

  1. 这个命令:xsltproc input.xls input.xml非常慢。单次运行大约需要 10 秒的执行时间(并且需要进行许多操作)

已经尝试过:

  1. 研究 xsltproc 是否可以做得更快(多线程运行) - 它不能
  2. 研究了硬件是否存在任何瓶颈 - 没有(NVMe 在非常快的 16 线程 CPU 上) 起初我以为读取一个 1GB 的文件需要很长时间。它没有,只是xsltproc处理需要时间

三个问题:

  1. 此 XSLT 样式表看起来是否经过优化?
  2. 有没有办法"在找到记录时终止搜索(即取消进一步读取)"?
  3. 如何显著提高上述命令的速度?

你在 10 秒内包括什么?这是否包括编译样式表和/或解析/加载源文档,还是纯粹的 XSLT 执行时间?

我希望构建 900Mb 输入文件的内存中树表示是花费大部分时间的(该操作需要 10 秒非常快)。如果您需要多次运行样式表,那么提高性能的最佳方法是只构建一次源代码树并重用它。但是,您将无法直接从命令行运行。

原则上,您可以使用键来加速这种样式表:

<xsl:key name="k" match="row" use="@Id"/>
<xsl:template match="/rowdata">
<xsl:value-of select="key('k', 10000)/@data"/>
</xsl:template>

但是,只有当您可以确保仅构建一次键索引,然后重复使用时,这才有效。在这个阶段,我无法告诉你这在xsltproc中是如何工作的,因为它都是特定于处理器的。

您可以在第一次命中后终止搜索,只需添加谓词[1]即可。但你正在寻找比这更大的收益。

假设只有一行Id是 1000,您可以简单地执行以下操作:

<xsl:template match="/rowdata">
<xsl:value-of select="row[@Id=1000]/@data"/>
</xsl:template>

我不知道这是否会"显着提高命令的速度"。

相关内容

  • 没有找到相关文章

最新更新