3

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

_XmlTextWriterObject = new XmlTextWriter(_xmlFilePath, null);

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

编辑

抱歉,我实际上无法传达我的意思。感谢 Ash 指出。我确实会使用 XmlTextWriter 但我的意思是说是将物理文件路径字符串传递给 XmlTextWriter 构造函数(或者,如约翰建议的那样,传递给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
}
4

3 回答 3

9

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

但请记住,XmlWriterimplements IDisposable,因此请执行以下操作:

using (XmlWriter _XmlTextWriterObject = XmlWriter.Create(_xmlFilePath))
{
   // Code to do the write here
}
于 2010-04-20T06:47:30.533 回答
4

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

如前所述,您的更新XmlWriter.Create很好。

还是我应该先将整个 xml 写入内存流中,然后再将 xml 文档从内存流中写入物理文件中?

您是否有内存将整个文件写入内存?如果你这样做了,那么这种方法会更快,否则使用FileStream它会为你处理它。

在这两种情况下对内存/性能有什么影响?

读入整个 XML 文件将使用更多内存,并开始启动处理器。流式传输到磁盘将使用更多处理器。但是,考虑到现在的桌面硬件,您需要使用一个巨大的文件才能让这一点变得引人注目。如果您担心将来尺寸会进一步增加,请坚持使用该FileStream技术以防万一。

于 2010-04-20T08:11:27.440 回答
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();
}

否则我认为一切都很好。

于 2010-04-20T08:01:07.700 回答