写入大量XML数据到文件的最佳方法是什么?

4

我目前正在使用 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
@Filip,放轻松!Kayes只是一个14天的会员,只提出了5个问题。请耐心等待他适应这里的环境。 - Ash
1
处理任何类型的大文件时,我会避免将其全部加载到内存中。相反,使用基于流的 API 确保每次只有文件的一部分在内存中。我相信 XmlTextWriter 允许您逐个元素地将其写入文件。 - Ash
@Filip 我会尽力做个好的StackOverflow社区公民 :) 现在开心了吗?@Ash 谢谢。我实际上是想问是否使用基于流的API。请看我的编辑。 - Kayes
1
你不再需要 BufferedStream 了,自从2版以后它已经内置到 FileStream 中了。 - Chris S
@Ash,@Kayes,这并不是任何不尊重的意思。更像是一种鼓励,说:“你们能行!”。 :) - Filip Ekberg
3个回答

9

通常情况下,当文档只需要进行写操作而不需要在内存中操作时,请使用XmlWriter。如果您确实需要在内存中处理它,请使用XmlDocument(或DOM)。

请注意,XmlWriter实现了IDisposable接口,因此请执行以下操作:

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

实际上,规则是使用XmlWriter.Create()而不是new XmlTextWriter()。自.NET 2.0以来,XmlTextWriter已被弃用。 - John Saunders
@John - 很好,我不知道那个。已编辑答案。 - Kyle Rosendo

4

虽然我的代码能够正常运行,但我想问是否这是最佳方案?

如您所提及并更新,XmlWriter.Create 是可以的。

或者,我应该先将整个 XML 写入内存流,然后再从内存流向物理文件中写入 XML 文档吗?

您有足够的内存将整个文件写入内存吗?如果有,那么这种方法会更快,否则使用 FileStream 进行流式传输,它会为您处理好。

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

读取整个 XML 文件将使用更多的内存,并在开始时使处理器峰值。将其流式传输到磁盘将使用更多的处理器。但是,即使是现在的桌面硬件,您需要使用非常大的文件才能注意到这一点。如果您担心未来大小会增加更多,请使用 FileStream 技术以保证其未来兼容。


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

否则,我认为一切都还好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接