2012-12-12 54 views
1

编写XML在C#我想要得到一个大的数据集的XML字符串:OutOfMemoryException异常试图从数据集

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() 

任何建议?

+0

[使用System.Data或System.Xml名称中的类的受管代码解决方案在处理大型数据集时可能会遇到System.OutOfMemoryException](http://blogs.msdn.com/b/vsofficedeveloper/archive/2008 /10/10/stringbuilder-outofmemoryexception.aspx)。 –

回答

1

首先你创造巨大的(显然)XML数据

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

克隆后它,进入string对象writer.ToString();,让你几乎双倍的内存需要。

什么你可以做的,是创造XML行每行,所以建立一种XmlDataSetRowEnumerator,检索XML-per-rowyield return S中产生的XML

+0

那么将数据集分成不同的数据集呢? –

相关问题