2014-01-08 2 views
0

대용량 데이터 집합에서 XSL 변환 중에 메모리가 부족한 이전 .NET 1.1 응용 프로그램을 유지 관리하고 있습니다..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 오히려 FileStream보다 MemoryStream에 기록 된 상황을 설명하거나 XslCompiledTransform를 사용하여 참조 : XML은 FileStream에 직접 기록 , 안타깝게도 .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는 XmlDataDocument에 의해 생성 된 XML을 볼 때 스키마가 입력 XML (원래 코드 인'XmlWriteMode.WriteSchema'가 사용됨)에 존재할 것으로 기대합니다. 스키마가 포함되어 있는지 확인하는 방법이 있습니까? – bernhof

+0

@mbjdev, 죄송 합니다만, XSLT가 기대하는 내용을 생성하지 않으면 DataSet을 인수로 사용하는 생성자 만 있습니다. 그런 다음 내 제안을 통해 메모리 문제가 해결되는지 여부를 확인할 수 없습니다. 나는 .NET 2.0 이후에서 "sourceStream"과 "sourceStreamWriter"를 Transform 호출이 만들어지기 전에'Using/End Using'로 래핑함으로써 "제거"하려고 할 것이지만, .NET 1.1에서는 이러한 객체를 처리 할 수 ​​있는지 여부를 기억하지 않습니다. 어쩌면 다른 누군가가 생각을 갖고있을 수도 있습니다. –