我正在使用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)
{
}
答案 0 :(得分:0)
代码中有很多可以改进的地方,但是我不知道这些改进是否与您看到的问题有关。
基本上,可以在处理器-XsltCompiler-XsltExecutable-XdmNode-XsltTransformer之间进行拆分,以共享任何可以共享的内容。您应该始终尝试共享处理器(大多数应用程序应创建一个处理器并重复使用)。如果在多个源文档上运行相同的样式表,则应该共享XsltExecutable。如果在同一源文档上运行不同的样式表,则应共享XdmNode。依此类推。
对于您的内存问题以及所有性能问题,细节在于细节,您需要深入研究以找出造成痛苦的大海捞针。我对.NET工具的熟悉程度不及对Java工具的熟悉程度,但是方法是相同的。测量随着工作的进行,内存使用情况如何变化,因此您可以隔离负责的步骤。测量更改输入时的内存使用情况如何变化,例如它与源文档大小之间的关系。并使用堆分析工具发现哪些对象实际上在占用内存。
通常,您可以从两个方面解决性能问题。 (a)找出工作量的哪些方面导致观察到的指标(例如内存使用情况)发生变化? (b)将顶级问题指标细分为更细粒度的指标,例如,已编译样式表所占的空间,源文档树所占的空间以及结果文档所占的空间(对于某些情况,您所显示的原因,要保留在MemoryStream中。)
对性能问题至关重要的另一件事是它们需要量化。您需要量化您的需求/期望,并根据需求量化实际指标。值得注意的是,您的问题不包含任何数字信息。