Суммарный максимум, рассчитать для каждой родительской записи - PullRequest
0 голосов
/ 01 июня 2009

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

Аннотация
Если вы хотите отобразить максимальное значение поля, вы можете использовать функтоид Кумулятивный максимум.

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

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

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

Есть предложения?

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

http://martinbring.blogspot.com

1 Ответ

3 голосов
/ 02 июня 2009

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

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

Решение
Один скриптовый функтоид, «Шаблон вызова встроенного XSLT» без ввода или вывода, содержащий часть max () библиотеки из EXSLT Здесь найдена библиотека Math . Вместо использования всей библиотеки я разархивировал файл и "извлек" шаблон 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>

Один скриптовый функтоид, «Шаблон вызова Inline 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>  

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

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

Voila!

...