Совокупный максимум, вычисляемый для каждой родительской записи

Кто-нибудь использовал функтоид Cumulative Maximum и заметил проблемы с производительностью?

Abstract
Если нужно отобразить максимальное значение поля, можно использовать функтоид Cumulative Maximum.

Проблема
После того, как мы использовали его некоторое время, мы заметили снижение производительности при работе с большими файлами.

Изучая xslt, можно заметить, что максимальное вычисление выполняется для каждой записи цикла...

Можно было бы переместить вычисление в родительский элемент и указать новый xslt в пользовательском пути XSL, но мне действительно нравится сохранять возможность сопоставления в инструменте сопоставления.

Какие-либо предложения?

С уважением
Мартин Бринг

http://martinbring.blogspot.com


person Martin Bring    schedule 01.06.2009    source источник
comment
@Мартин, не могли бы вы отредактировать и уточнить свой вопрос?   -  person Mitch Wheat    schedule 01.06.2009


Ответы (1)


Удалив Cumulative Maximum и добавив 3 скриптовых функтоида, сделав расчет другим способом, проблема решена. Время сопоставления сократилось в 40 раз.

11 МБ, 10 000 строк, которые ранее отображались за 200 минут, теперь отображаются за 5 минут.

Решение
Один скриптовый функтоид, "Шаблон встроенного вызова XSLT" без ввода и вывода, содержащий часть библиотеки max() из EXSLT Математическая библиотека находится здесь. Вместо того, чтобы использовать всю библиотеку, я разархивировал файл и «извлек» шаблон max().

 <xsl:template name="GetMax">
   <xsl:param name="nodes" /> 

    <xsl:choose>
      <xsl:when test="not($nodes)">NaN</xsl:when> 
      <xsl:otherwise>
        <xsl:for-each select="$nodes">
          <xsl:sort data-type="number" order="descending" /> 
          <xsl:if test="position() = 1">
          <xsl:value-of select="number(.)" /> 
        </xsl:if>
       </xsl:for-each>
     </xsl:otherwise>
   </xsl:choose>
 </xsl:template>

Один функтоид сценария, «Шаблон встроенного вызова XSLT» без ввода или вывода, содержащий переменную, которая выбирает атрибут, указывает на шаблон с узлом, установленным для вычисления

<xsl:variable name="var:MaxValueDate">
    <xsl:call-template name ="GetMax">
            <xsl:with-param name ="nodes" select="Root//Parent/ValueToCalculate" />
    </xsl:call-template>
</xsl:variable>  

Один скриптовый функтоид, «Встроенный XSLT» с одним выходом, использующий переменную для заполнения выходного элемента ее значением.

<OutputElement>
        <xsl:value-of select="$var:MaxValueDate" />
</OutputElement>

Вуаля!

person Martin Bring    schedule 02.06.2009