将巨大的xml数据写入文件的最佳方法?

时间:2010-04-20 06:43:28

标签: c# asp.net xml xmlwriter

我目前正在使用 XmlTextWriter类将包含大量数据(100000+记录)的数据库表导出到xml文件中,并且我正在直接写入文件物理驱动器。

_XmlTextWriterObject = new XmlTextWriter(_xmlFilePath, null);

虽然我的代码运行正常但我的问题是它是最好的方法吗?我应该首先在内存流中写入整个xml,然后从内存流中将xml文档写入物理文件中吗?在这两种情况下,对内存/性能的影响是什么?

修改

很抱歉,我实际上无法表达我的意思。谢谢Ash指出。 我确实会使用XmlTextWriter,但我想说是否将物理文件路径字符串传递给XmlTextWriter构造函数(或者,如John建议的那样,传递给XmlTextWriter.Create()方法)或使用基于流的api。我当前的代码如下所示:

XmlWriter objXmlWriter = XmlTextWriter.Create(new BufferedStream(new FileStream(@"C:\test.xml", FileMode.Create, System.Security.AccessControl.FileSystemRights.Write, FileShare.None, 1024, FileOptions.SequentialScan)), new XmlWriterSettings { Encoding = Encoding.Unicode, Indent = true, CloseOutput = true });
using (objXmlWriter)
{
   //writing xml contents here
}

3 个答案:

答案 0 :(得分:9)

经验法则是当文档只需要编写而不是在内存中使用时使用XmlWriter,并使用需要使用它的XmlDocument(或DOM)在记忆中。

请记住,XmlWriter实现了IDisposable,所以请执行以下操作:

using (XmlWriter _XmlTextWriterObject = XmlWriter.Create(_xmlFilePath))
{
   // Code to do the write here
}

答案 1 :(得分:4)

虽然我的代码运行正常但我的问题是它是最好的方法吗?

如上所述和您的更新,XmlWriter.Create没问题。

或者我应该首先在内存流中编写整个xml,然后从内存流中将xml文档写入物理文件中?

你有内存将整个文件写入内存吗?如果你这样做,那么这种方法会更快,否则使用FileStream来传递它,它会照顾你。

两种情况下对内存/性能的影响是什么?

读取整个XML文件将使用更多内存,并启动处理器。流式传输到磁盘将使用更多的处理器。但是,即使是桌面硬件,你也需要使用一个巨大的文件。如果你担心未来的尺寸会越来越大,那就坚持使用FileStream技术来证明它。

答案 2 :(得分:2)

正如John Saunders所说,最好使用XmlWriter.Create()。这是MSDN的建议。 XmlWriter.Create()方法也可以使用XmlWriterSettings对象。在那里你可以自定义你的行为。如果您不需要验证和字符检查,那么您可以将其关闭并获得更快的速度。例如

XmlWriterSettings settings = new XmlWriterSettings();
settings.CheckCharacters = false;
using (XmlWriter writer = XmlWriter.Create("path", settings))
{
    //writing code
    writer.Flush();
}

否则我觉得一切都还好。