2014-01-08 2 views
0

Я поддерживаю старое приложение .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)

+0

ли это работать на небольшом наборе данных? – harpo

+0

Действительно. В течение многих лет он работал отлично, однако наборы данных никогда не были такими большими, как те, которые они пытаются обработать в этом конкретном случае. – bernhof

+1

Без кода нельзя сказать, но в XSLT есть много способов ошибиться. Один из распространенных способов сделать преобразования более эффективными - разбить их на более мелкие шаги, чтобы избежать повторного обхода. Вы можете также использовать клавиши в случаях при одинаковом эффекте. – harpo

ответ

0

Мы не нашли способ решить эту проблему изнутри. СЕТЬ. Мы можем попытаться оптимизировать XSLT в будущем.

(На данный момент, клиент согласился на данные разделить на группы, в результате чего в нескольких файлах)

1

Что вы могли бы попробовать, вместо

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'), который он не смотрит на XML, сгенерированный XmlDataDocument. Есть ли способ обеспечить включение схемы? – bernhof

+0

@mbjdev, извините, только конструктор принимает DataSet в качестве аргумента, если это не создает содержимое, которое ожидает XSLT, тогда мое предложение не позволит вам проверить, разрешает ли он проблему памяти. Я не уверен, что еще вы могли попробовать, в .NET 2.0 или более поздней версии я попытался бы «избавиться» от 'sourceStream' и' sourceStreamWriter', завернув их в 'Using/End Using' перед вызовом Transform в .NET 1.1 Я не помню, можно ли распоряжаться этими объектами. Может быть, у кого-то есть идея. –

Смежные вопросы