Проблема производительности с индексом XSLT, имеющим много идентичных ключей - PullRequest
0 голосов
/ 14 сентября 2010

Я использую ключи XSLT во многих контекстах. Обычно используемые ключи более или менее уникальны с очень редкими дублирующимися экземплярами. Теперь я определил ключ, который имеет много экземпляров для некоторых значений ключа. Чтобы быть точным: я обрабатываю файл 1.7 GigaByte с 420.000 записей, имеющих атрибут @STEREOTYPE. Некоторые из стереотипов встречаются до 90.000 раз. Но это не те, которые мне интересны. Те, которые я хотел бы выбрать, обычно имеют от 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) для всех подмножеств с одинаковыми ключами. Это довольно плохо для подмножеств 90.000 записей. : - (

Однако я не могу использовать определение альтернативного индекса, поскольку заранее не знаю части OBJECT_ID экземпляра.

Есть идеи? Большое спасибо!

Saxon используется: версия 9.1.0.5

1 Ответ

1 голос
/ 14 сентября 2010

Вы пытались использовать только <xsl:for-each-group>?

Если вы предоставите подходящий исходный 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) документов и обработайте их отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...