Saxon.net内存问题

时间:2018-11-01 14:14:51

标签: validation saxon schematron

我正在使用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 :(得分:0)

代码中有很多可以改进的地方,但是我不知道这些改进是否与您看到的问题有关。

基本上,可以在处理器-XsltCompiler-XsltExecutable-XdmNode-XsltTransformer之间进行拆分,以共享任何可以共享的内容。您应该始终尝试共享处理器(大多数应用程序应创建一个处理器并重复使用)。如果在多个源文档上运行相同的样式表,则应该共享XsltExecutable。如果在同一源文档上运行不同的样式表,则应共享XdmNode。依此类推。

对于您的内存问题以及所有性能问题,细节在于细节,您需要深入研究以找出造成痛苦的大海捞针。我对.NET工具的熟悉程度不及对Java工具的熟悉程度,但是方法是相同的。测量随着工作的进行,内存使用情况如何变化,因此您可以隔离负责的步骤。测量更改输入时的内存使用情况如何变化,例如它与源文档大小之间的关系。并使用堆分析工具发现哪些对象实际上在占用内存。

通常,您可以从两个方面解决性能问题。 (a)找出工作量的哪些方面导致观察到的指标(例如内存使用情况)发生变化? (b)将顶级问题指标细分为更细粒度的指标,例如,已编译样式表所占的空间,源文档树所占的空间以及结果文档所占的空间(对于某些情况,您所显示的原因,要保留在MemoryStream中。)

对性能问题至关重要的另一件事是它们需要量化。您需要量化您的需求/期望,并根据需求量化实际指标。值得注意的是,您的问题不包含任何数字信息。