1

C#では、大きなデータセットからxml文字列を取得しようとしています。

private string GetXmlFromDecomposedPortfolio(string dataSetName, DecomposedPortfolio ptf)
{
     StringWriter writer = new StringWriter();

     System.Data.DataSet ds = new System.Data.DataSet(dataSetName);

     ds.Tables.Add(ptf.Security.Copy());   
     ds.WriteXml((TextWriter)writer, XmlWriteMode.IgnoreSchema);

     return writer.ToString();
}

しかし、私には例外があります:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.     
    at System.String.GetStringForStringBuilder(String value, Int32 startIndex, Int32 length, Int32 capacity)    
    at System.Text.StringBuilder.GetNewString(String currentString, Int32 requiredLength)    
    at System.Text.StringBuilder.Append(Char value)     at System.IO.StringWriter.Write(Char value)  
    at System.Xml.XmlTextWriter.WriteStartElement(String prefix, String localName, String ns)   
    at System.Data.DataTextWriter.WriteStartElement(String prefix, String localName, String ns)  
    at System.Data.XmlDataTreeWriter.XmlDataRowWriter(DataRow row, String encodedTableName)  
    at System.Data.XmlDataTreeWriter.Save(XmlWriter xw, Boolean writeSchema)    
    at System.Data.DataSet.WriteXml(XmlWriter writer, XmlWriteMode mode)   
    at System.Data.DataSet.WriteXml(TextWriter writer, XmlWriteMode mode)    
    at Decompose.Library.Render.GetXmlFromDecomposedPortfolio(String dataSetName, DecomposedPortfolio ptf)   
    at Decompose.Library.Render.SavePE()  
    at Decompose.Library.WorkFlow.ProcessBatch()

なにか提案を?

4

1 に答える 1

1

まず、巨大な (明らかに) xml データを作成します。

ds.WriteXml((TextWriter)writer, XmlWriteMode.IgnoreSchema);

stringそれをオブジェクトに複製した後、writer.ToString();必要なメモリがほぼ2倍になります。

あなたができることは、XML行ごとに行を作成することです。したがって、結果のXmlDataSetRowEnumeratorを取得XML-per-rowしてyield returnsする種類の を作成しますXML

于 2012-12-12T16:17:42.750 に答える