Я поддерживаю старое приложение .NET 1.1, которое исчерпывает память во время преобразования XSL в большом наборе данных. XML записывается непосредственно в FileStream
:OutOfMemoryException при преобразовании XSL в .NET 1.1
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)
ли это работать на небольшом наборе данных? – harpo
Действительно. В течение многих лет он работал отлично, однако наборы данных никогда не были такими большими, как те, которые они пытаются обработать в этом конкретном случае. – bernhof
Без кода нельзя сказать, но в XSLT есть много способов ошибиться. Один из распространенных способов сделать преобразования более эффективными - разбить их на более мелкие шаги, чтобы избежать повторного обхода. Вы можете также использовать клавиши в случаях при одинаковом эффекте. – harpo