• 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其实它只是一个框架。凡是二进制汇编等能实现的事情,高级语言也是都能实现的。计算机无非就是一个二进制的运算。它可以将数据写入内存,定然也可以将数据写入硬盘。毕竟这种事情我们每天都在做。只是忽略了它。所以我要打破自己的思维限制,大胆设想!

  • 相关阅读:
    oracle 数据库 Cause: java.sql.SQLSyntaxErrorException: ORA-00904: "BODY": 标识符无效
    windows获取所有连接过的无线网密码
    element-ui 组件 el-calendar 农历显示问题
    mysql表复制
    console 打印消息时,可以使用 %c 指定随后的文本样式; %s 可引用参数变量。
    mysql 查询出现 "this is incompatible with sql_mode=only_full_group_by"错误解决方案,以及个人rpm方式重装所遇到的问题备份
    java 关于xlsx(xls) 和 csv 文件的数据解析
    idea websorm 激活码(2020-1-6 实测可用)最新
    mysql 连接查询 转换group_concat, find_in_set
    今天带来compass的使用方式
  • 原文地址:https://www.cnblogs.com/honghong75042/p/3303093.html
Copyright © 2020-2023  润新知