代码之家  ›  专栏  ›  技术社区  ›  Marcus Rickert

XSLT索引有许多相同键时的性能问题

  •  0
  • Marcus Rickert  · 技术社区  · 14 年前

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

    <xsl:key 
         name="entityByStereotype" 
         match="/REPOSITORY_DUMP/ENTITY_LIST/ENTITY"
         use="@STEREOTYPE"/>
    

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

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

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

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

    使用的Saxon:版本9.1.0.5

    1 回复  |  直到 14 年前
        1
  •  1
  •   Dimitre Novatchev    14 年前

    你试过只用 <xsl:for-each-group> ?

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

    更新

    如果你事先知道 @STEREOTYPE 那么你感兴趣的 使用

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

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