.NET 1.1中的XSL转换期间发生OutOfMemoryException

.NET 1.1中的XSL转换期间发生OutOfMemoryException

问题描述:

我正在维护一个旧的.NET 1.1应用程序,该应用程序在大型数据集上进行XSL转换时内存不足。 XML被直接写入FileStream.NET 1.1中的XSL转换期间发生OutOfMemoryException

Dim xslDoc As New System.Xml.Xsl.XslTransform 
Dim sourceStream As New System.IO.MemoryStream 
Dim sourceStreamWriter As New System.IO.StreamWriter(sourceStream) 
Try 
    ' Load data and schema from DataSet 
    Dim sourceDoc As New System.Xml.XmlDocument 
    dataSet.WriteXml(sourceStreamWriter , XmlWriteMode.WriteSchema) 
    sourceStreamWriter.Flush() 
    sourceStream.Position = 0 
    sourceDoc.Load(sourceStream) 

    ' Load XSLT 
    xslDoc.Load("c:\path\to\transform.xslt") 

    ' Transform (FAILS HERE) 
    xslDoc.Transform(sourceDoc, Nothing, fileStream, New System.Xml.XmlUrlResolver) 
Finally 
    schemaStreamWriter.Close() 
    schemaStream.Close() 
End Try 

我发现对此事的类似的问题,但他们通常描述其中生成的XML被写入MemoryStream而非FileStream的情况,或者指的是使用XslCompiledTransform ,不幸的是,它只能从.NET 2.0开始使用。

如何避免在转换过程中使用所有内存?

(类似(解答)问题在这里:http://vbcity.com/forums/t/151286.aspx

+0

它是否适用于小型数据集? – harpo

+0

确实如此。它已经运行好几年了,但是,数据集从来没有像他们在这个特殊情况下要处理的那样大。 – bernhof

+1

没有代码就不可能说,但在XSLT中出现很多错误的方法。使变换更有效的一种常见方法是将它们分解成更小的步骤以避免重复遍历。您也可以使用按键来达到相同的效果。 – harpo

,我们发现没有办法从内部解决这个问题。净。我们可能会尝试在未来优化XSLT。

(目前,客户已同意将数据分成批次,产生多个文件)

什么你可以尝试,而不是

Dim sourceStream As New System.IO.MemoryStream 
Dim sourceStreamWriter As New System.IO.StreamWriter(sourceStream) 
Try 
    ' Load data and schema from DataSet 
    Dim sourceDoc As New System.Xml.XmlDocument 
    dataSet.WriteXml(sourceStreamWriter , XmlWriteMode.WriteSchema) 
    sourceStreamWriter.Flush() 
    sourceStream.Position = 0 
    sourceDoc.Load(sourceStream) 

    ' Load XSLT 
    xslDoc.Load("c:\path\to\transform.xslt") 

    ' Transform (FAILS HERE) 
    xslDoc.Transform(sourceDoc, Nothing, fileStream, New System.Xml.XmlUrlResolver) 

使用

Dim dataDoc as XmlDataDocument = new XmlDataDocument(dataSet) 
    ' Load XSLT 
    xslDoc.Load("c:\path\to\transform.xslt") 

    ' Transform (FAILS HERE) 
    xslDoc.Transform(dataDoc, Nothing, fileStream, New System.Xml.XmlUrlResolver) 
+0

有趣。但是,XSLT期望模式存在于输入XML中(在使用原始代码“XmlWriteMode.WriteSchema”时),而在查看由XmlDataDocument生成的XML时不会出现该模式。有没有办法确保包含模式? – bernhof

+0

@mbjdev,抱歉,只有将DataSet作为参数的构造函数,如果它不会创建XSLT期望的内容,那么我的建议不会允许您检查它是否解决了内存问题。我不确定还有什么可以尝试的,在.NET 2.0或更高版本中,我会尝试在转换调用之前将“sourceStream”和“sourceStreamWriter”封装到“Using/End Using”中,但“在.NET 1.1中,我不记得是否可以处理这些对象。也许别人有一个想法。 –