Совокупный максимум, рассчитываемый для каждой родительской записи
Вопрос
Кто-нибудь использовал кумулятивный максимальный функционал и заметил проблемы с производительностью?
Абстрактный
Если кто-то хочет сопоставить максимальное значение поля, вы можете использовать функциональный кумулятивный максимум.
Проблема
После того, как мы использовали его некоторое время, мы заметили снижение производительности при работе с файлами большего размера.
Изучая xslt, можно заметить, что максимальное вычисление производится для каждой циклической записи...
Можно было бы переместить вычисление к главному родителю и указать новый xslt в пользовательском пути XSL, но мне действительно нравится сохранять возможность сопоставления в инструменте сопоставления.
Есть какие-нибудь предложения?
С наилучшими пожеланиями
Мартин Принеси
Решение
Удалив Кумулятивный максимум и добавив 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>
Вуаля!