Xml XSLT索引具有多个相同键的性能问题

Xml XSLT索引具有多个相同键的性能问题,xml,xslt,Xml,Xslt,我在许多上下文中使用XSLT键。通常,使用的键或多或少是唯一的,很少有重复实例。现在我定义了一个键,它有很多键值的实例。确切地说:我正在处理一个1.7GB的文件,其中420.000个条目具有@STEREOTYPE属性。一些刻板印象最多出现9万次。不过,这些不是我感兴趣的。我想选择的通常有10到20个实例 关键的定义是 <xsl:key name="entityByStereotype" match="/REPOSITORY_DUMP/ENTITY_LIST/ENTI

我在许多上下文中使用XSLT键。通常,使用的键或多或少是唯一的,很少有重复实例。现在我定义了一个键,它有很多键值的实例。确切地说:我正在处理一个1.7GB的文件,其中420.000个条目具有@STEREOTYPE属性。一些刻板印象最多出现9万次。不过,这些不是我感兴趣的。我想选择的通常有10到20个实例

关键的定义是

<xsl:key 
     name="entityByStereotype" 
     match="/REPOSITORY_DUMP/ENTITY_LIST/ENTITY"
     use="@STEREOTYPE"/>
<xsl:key 
     name="entityByStereotype" 
     match="/REPOSITORY_DUMP/ENTITY_LIST/ENTITY"
     use="concat(@STEREOTYPE, @OBJECT_ID)"/>

索引的建立是永恒的,也就是说我通常在5到6个小时后终止这个过程

另一个关键点定义是

<xsl:key 
     name="entityByStereotype" 
     match="/REPOSITORY_DUMP/ENTITY_LIST/ENTITY"
     use="@STEREOTYPE"/>
<xsl:key 
     name="entityByStereotype" 
     match="/REPOSITORY_DUMP/ENTITY_LIST/ENTITY"
     use="concat(@STEREOTYPE, @OBJECT_ID)"/>

这将强制实例键是唯一的,其构建将在14秒后返回。我的假设是,排序算法对同一密钥的多个实例不太有效,导致具有相同密钥的所有子集的复杂性为O(n**2)。对于包含90000个条目的子集来说,这是非常糟糕的:-(

但是,我不能使用备用索引定义,因为我事先不知道实例的OBJECT_ID部分

有什么想法吗?非常感谢


Saxon使用:9.1.0.5版

您是否尝试只使用

如果您提供合适的源XML文档,我可能有兴趣帮助您找到一个更优化的解决方案

更新:我推荐一些其他技巧:

1) 如果您事先知道您感兴趣的
@STEREOTYPE
的值,则使用

<xsl:key  
     name="entityByStereotype"  
     match="/REPOSITORY_DUMP/ENTITY_LIST/ENTITY[@STEREOTYPE = ($val1, $val2,...,$val-n)]" 
     use="@STEREOTYPE"/>

如您所说,如果它们只发生10-20次,那么哈希表(是的,排序对实现键没有意义)将更容易构建


2) 将XML文档拆分为几个较小的(比如10个)文档并分别处理。

您能否预处理输入文档以排除不需要的重复项?这可以通过使用一个快速SAX解析器来实现。那么,让实体感兴趣的确切标准是什么?你不能根据这些标准来构建密钥吗?确切的标准是寻找一个特定的原型。目前,没有其他可用的标准。预处理输入可能是一个选项。我可以将这个实体子集移动到XML树中的不同位置。经过一定的努力,这可能会解决特定的问题。然而,如果能知道索引速度如此之慢的真正原因,那就太好了。另外,我们处理的其他部分实际上可以从原型的这个特定索引中获益。你真的需要键吗?正如Dimitre所指出的,对于XSLT2.0分组,我们对每个组使用
。那么,您是否要进行交叉引用选择?如果没有,为什么不使用模式匹配呢?你最终会得到一个非常具体的样式表,但也许你可以流式处理它。@Marcus Rickert:我已经用一些额外的建议更新了我的答案。按名称选择相关的原型就可以了。非常感谢你!然而,我认为这种行为是一种缺陷。也许我应该把它交给萨克森。