【问题标题】:Best approach to write huge xml data to file?将大量 xml 数据写入文件的最佳方法?
【发布时间】:2010-04-20 06:43:28
【问题描述】:

我目前正在使用 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
}

【问题讨论】:

  • @Filip,放轻松! Kayes 成为会员仅 14 天,只问了 5 个问题。
  • 处理任何类型的大文件时,我都会避免将其全部加载到内存中。而是使用基于流的 API 来确保在任何时候只有文件的块在内存中。我相信 XmlTextWriter 可以让您逐个元素地写入文件。
  • @Filip 我会努力成为一个好公民@StackOverflow :) 现在快乐吗? @Ash 谢谢。我实际上打算说要使用基于流的 api。查看编辑。
  • 你不再需要 BufferedStream,它自 2 以来就内置在 FileStream 中
  • @Ash,@Kayes,这根本没有任何不尊重的意思。更像一个;普通你可以做到!或者类似的东西:)

标签: c# asp.net xml xmlwriter


【解决方案1】:

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

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

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

【讨论】:

  • 其实规则是用XmlWriter.Create()代替new XmlTextWriter()XmlTextWriter 自 .NET 2.0 起已被弃用。
  • @John - 很好,我不知道。编辑答案。
【解决方案2】:

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

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

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

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

这两种情况对内存/性能有何影响?

读入整个 XML 文件将使用更多内存,并开始启动处理器。流式传输到磁盘将使用更多处理器。但是你需要使用一个巨大的文件才能让这一点即使现在桌面硬件也很明显。如果您担心未来尺寸会进一步增加,请坚持使用FileStream 技术来验证它。

【讨论】:

    【解决方案3】:

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

    否则我认为一切都很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2015-02-07
      • 1970-01-01
      • 2020-09-01
      • 2021-09-08
      • 1970-01-01
      • 2011-05-16
      相关资源
      最近更新 更多