zoukankan      html  css  js  c++  java
  • c#以文件流的形式输出xml(可以解决内存溢出)-XmlTextWriter

    1、XmlTextWriter 表示提供快速、非缓存、只进方法的编写器,该方法生成包含 XML 数据(这些数据符合 W3C 可扩展标记语言 (XML) 1.0 和“XML 中的命名空间”建议)的流或文件。

    public class XmlTextWriter : XmlWriter XmlTextWriter继承抽象类 XmlWriter

    XmlTextWriter 小例子:

      string resultFileName = "c:/44.txt";
                if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(resultFileName)))
                {
                    System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(resultFileName));
                }
    
                XmlTextWriter result = new XmlTextWriter(resultFileName, null);
                result.Formatting = Formatting.Indented;
                result.WriteStartElement("PolicyList");
                result.WriteStartElement("Policy");
                result.WriteAttributeString("username", "USERNAME"+i.ToString());
                result.WriteEndElement();
                result.WriteEndElement();
                result.Close();

     XmlTextWriter 之所以不产生内存溢出是因为它是以流的形式将数据写入硬盘中的。

    2、 我做了一个XmlTextWriter 与普通拼接字符的形式对比:

    XmlTextWriter

      string resultFileName = "c:/44.txt";
                if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(resultFileName)))
                {
                    System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(resultFileName));
                }
    
                XmlTextWriter result = new XmlTextWriter(resultFileName, null);
                result.Formatting = Formatting.Indented;
                result.WriteStartElement("PolicyList");
                for (int i = 0; i < 100000000; i++)
                {
                    result.WriteStartElement("Policy");
                    result.WriteAttributeString("username", "USERNAME"+i.ToString());
                    result.WriteEndElement();
                }
                result.WriteEndElement();
                result.Close();

    普通:

      XmlDocument xmlD = new XmlDocument();
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 100000000; i++)
                {
                    sb.Append("<PolicyList username='USERNAME"+i.ToString()+"' />");
                }
                xmlD.LoadXml(sb.ToString());
                StreamWriter sw = new StreamWriter("c:/55.txt");
                sw.Write("www");
                sw.Close();

    第一个正常显示,第二个则出现内存溢出提示。所以在大数据量的时候。一定要写成流的形式,这样可以防止内存溢出。

    3、由这件事情让我想到好多

    以前我们用.net写输出时,没想过要将数据写到硬盘。如果出现内存溢出就无计可施。其实我当时真的没想过要讲数据写入硬盘吗?错了,我想到过。但是我马上否定了我自己,总感觉这是不可能实现的事情。这就是思维限制。我的思维已经受限。后来我想.net其实它只是一个框架。凡是二进制汇编等能实现的事情,高级语言也是都能实现的。计算机无非就是一个二进制的运算。它可以将数据写入内存,定然也可以将数据写入硬盘。毕竟这种事情我们每天都在做。只是忽略了它。所以我要打破自己的思维限制,大胆设想!

  • 相关阅读:
    AX 2012 Security Framework
    The new concept 'Model' in AX 2012
    How to debug the SSRS report in AX 2012
    Using The 'Report Data Provider' As The Data Source For AX 2012 SSRS Report
    Deploy SSRS Report In AX 2012
    AX 2012 SSRS Report Data Source Type
    《Taurus Database: How to be Fast, Available, and Frugal in the Cloud》阅读笔记
    图分析理论 大纲小结
    一文快速了解Posix IO 缓冲
    #转载备忘# Linux程序调试工具
  • 原文地址:https://www.cnblogs.com/honghong75042/p/3303093.html
Copyright © 2011-2022 走看看