Saxon.net Проблема с памятью - PullRequest
0 голосов
/ 01 ноября 2018

У меня проблемы с памятью в Saxon.net. Я использую Saxon 9.8.0.7. Ниже приведен мой фрагмент кода. что можно улучшить?

Этот метод вызывается для каждого XSLT, поэтому его можно вызывать 3-4 раза для проверки отдельного документа

 public Stream TransformToStream(Stream xmlstream, string xsltLocation)
        {
            Stream resultStream = new MemoryStream();
            try
            {
                // Create a Processor instance.
                Processor processor = new Processor();


                // Load the source document
                var documentbuilder = processor.NewDocumentBuilder();
                documentbuilder.BaseUri = new Uri("http://dummy.base.uri/");

                XdmNode input = documentbuilder.Build(xmlstream);

                XsltExecutable exec = null;
                // Create a transformer for the stylesheet.
                var compiler = processor.NewXsltCompiler();

 compiler.ErrorList = new 
               System.Collections.Generic.List<Exception>();

               string filename = xsltLocation.Substring(7);

 exec = compiler.Compile(new Uri(filename));

  XsltTransformer transformer = exec.Load();

                    // Set the root node of the source document to be the initial context node
                    transformer.InitialContextNode = input;

                    // Create a serializer
                    Serializer serializer = new Serializer();
                    serializer.SetOutputStream(resultStream);

                    // Transform the source XML to System.out.
                    transformer.Run(serializer);
  }
                catch (Exception exx)
                {
}

1 Ответ

0 голосов
/ 01 ноября 2018

В вашем коде многое можно улучшить, но я понятия не имею, относятся ли эти улучшения к проблемам, с которыми вы сталкиваетесь.

По сути, существует разделение между Процессором - XsltCompiler - XsltExecutable - XdmNode - XsltTransformer, которое позволяет вам делиться всем, что может делиться. Вы всегда должны пытаться совместно использовать процессор (большинство приложений должны создать один процессор и использовать его повторно). Если вы запускаете одну и ту же таблицу стилей в нескольких исходных документах, XsltExecutable должен быть общим. Если вы запускаете разные таблицы стилей для одного и того же исходного документа, XdmNode должен быть общим. И так далее.

Что касается проблем с памятью, то, как и со всеми проблемами с производительностью, дьявол будет в деталях, и вам нужно углубиться, чтобы найти иголку в стоге сена, которая вызывает боль. Я менее знаком с инструментами .NET, чем с инструментами Java, но методология та же. Измерьте, как изменяется использование памяти по мере выполнения работы, чтобы вы могли выделить соответствующие шаги. Измерьте, как изменяется использование памяти при изменении входа, например, как это соотносится с размером исходного документа. И используйте инструменты анализа кучи, чтобы узнать, какие объекты на самом деле занимают память.

Очень часто вы можете решать проблему производительности с двух сторон. (а) выяснение того, какие аспекты рабочей нагрузки приводят к изменению наблюдаемой метрики (например, использования памяти)? (б) разбить метрику задачи верхнего уровня на более детализированные метрики, например, пространство, занимаемое скомпилированной таблицей стилей, пространство, занимаемое деревьями исходного документа, и пространство, занимаемое результирующим документом (который вы видите, для некоторых причина, чтобы держать в MemoryStream.)

Другая проблема, которая критична для проблем с производительностью, заключается в том, что они должны быть определены количественно. Вам необходимо количественно оценить ваши требования / ожидания и количественно определить фактическую метрику в соответствии с требованием. Примечательно, что ваш вопрос не содержит никакой цифровой информации.

...