我的意思是,我正在尝试构建XML文件,因为正在从数据库中读取记录。在某种程度上,我猜你说我正在做DataSet.WriteToXML()
的手动版本。但是我需要在数据流过时控制数据,因此手动编写记录。
我的问题是,无论我使用XDocument
尝试做什么,无论有没有Streams
,我发现我添加的元素只是堆积在内存中。即使我试图批量生产#34;记录并偶尔拨打XDocument.Save()
,我仍然会在某个时候找到OutOfMemoryException
。
首先,我想知道有没有"读取记录,写一条记录" ......从DataTable.Row直接传递到XML节点/子节点(XML中的记录)。即使我怀疑任何"是"答案将来自它将涉及的所有I / O的主要性能损失。
我的最新迭代(列出的内容太多了):
XDocument xdoc = null;
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = true;
using (var fs = new FileStream(tmpXml, FileMode.Open, FileAccess.ReadWrite))
xdoc = XDocument.Load(XmlReader.Create(fs));
foreach (DataTable dt in ds.Tables)
{
using (var reader = sql.ExecuteReader(String.Format(@"SELECT * FROM ""{0}""", dt.TableName)))
{
if (reader.HasRows)
{
while (reader.Read())
{
var tableElement = new XElement(dt.TableName);
xdoc.Root.Add(tableElement);
foreach (DataColumn dc in dt.Columns)
{
if (dt.TableName.EndsWith("_Option") && reader.GetOrdinal(dc.ColumnName) == 13)
tableElement.Add(new XElement(dc.ColumnName, ""));
else
tableElement.Add(new XElement(dc.ColumnName, reader[dc.ColumnName]));
}
}
}
}
}
所以基本的问题是,采用我读取的行的最有效方法是什么,并尽快将它们放入物理XML文件中,防止XDocument在内存中堆积数据?
编辑:我应该指出XML文件已经存在,只写了表模式。这里的目标是打开该文件,将实际数据记录写入其中并保存。