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

StackOverflow https://stackoverflow.com/questions/933942

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Есть какие-нибудь предложения?

С наилучшими пожеланиями
Мартин Принеси

http://martinbring.blogspot.com

Это было полезно?

Решение

Удалив Кумулятивный максимум и добавив 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>

Вуаля!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top