.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)
,我们发现没有办法从内部解决这个问题。净。我们可能会尝试在未来优化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)
有趣。但是,XSLT期望模式存在于输入XML中(在使用原始代码“XmlWriteMode.WriteSchema”时),而在查看由XmlDataDocument生成的XML时不会出现该模式。有没有办法确保包含模式? – bernhof
@mbjdev,抱歉,只有将DataSet作为参数的构造函数,如果它不会创建XSLT期望的内容,那么我的建议不会允许您检查它是否解决了内存问题。我不确定还有什么可以尝试的,在.NET 2.0或更高版本中,我会尝试在转换调用之前将“sourceStream”和“sourceStreamWriter”封装到“Using/End Using”中,但“在.NET 1.1中,我不记得是否可以处理这些对象。也许别人有一个想法。 –
它是否适用于小型数据集? – harpo
确实如此。它已经运行好几年了,但是,数据集从来没有像他们在这个特殊情况下要处理的那样大。 – bernhof
没有代码就不可能说,但在XSLT中出现很多错误的方法。使变换更有效的一种常见方法是将它们分解成更小的步骤以避免重复遍历。您也可以使用按键来达到相同的效果。 – harpo