使用linq to xml 怎么减小内存消耗
2012-03-28 20:52
639 查看
需要注意的一点是.net framework3.5中提供的Linq to Xml是“内存”的处理方式,所以有多少节点,就要消耗多少内存,如果这个xml很大,也就是如果有1000级的目录嵌套,每级有100个子目录,那么就有100^1000个XElement在内存中创建出来,好吧,这么计算一下,整个过程需要多少内存吧,10的2000次方*每一个XElement消耗的内存,就算只有1个Byte,1G内存也只能处理10的30次方,所以要处理完这个场景,说需要的多少内存可以说是不可能达到的。但系统内存却有限的情况下怎么办哪?
下面介绍一种方式:
System.xml.linq 中提供的一个类(流) XSteamingElement类,即:表示延迟流输出的 XML 树中的元素,这个类如果从输入源(如文本文件)进行流式处理,则可以读取非常大的文本文件,并生成非常大的 XML 文档,同时保持较小的内存需求量,这个类正是我们所要找的。
实例:
以上仅供参考,如有错误之处,请大家提出,大家一起讨论.
下面介绍一种方式:
System.xml.linq 中提供的一个类(流) XSteamingElement类,即:表示延迟流输出的 XML 树中的元素,这个类如果从输入源(如文本文件)进行流式处理,则可以读取非常大的文本文件,并生成非常大的 XML 文档,同时保持较小的内存需求量,这个类正是我们所要找的。
实例:
读取C盘所有的文件夹及文件
public static XStreamingElement GetFolderContent(DirectoryInfo di) { return new XStreamingElement("folder", new XAttribute("name", di.Name), from subDir in di.GetDirectories() select GetFolderContent(subDir), from file in di.GetFiles() select new XElement("file", new XAttribute("name", file.Name))); }
//读取C盘所有的文件夹及文件
var di = new DirectoryInfo(@"C:\"); GetFolderContent(di).Save(@"d:\Folder.xml");
注意:这里必须要用XStreamingElement的Save方法,否则延迟求解的特性可能会失效。
以上仅供参考,如有错误之处,请大家提出,大家一起讨论.
相关文章推荐
- 使用linq to xml 快速创建自己的Rss -- 转载自 半途 blog
- 使用Linq to XML加载XML文档
- 使用linq to xml 快速创建自己的Rss 之二 Syndication篇
- 在.net framework 2 中使用linq to xml
- [代码]使用LINQ的查询结果填充XML树(LINQ to XML)
- [代码]使用XmlReader对XML片段进行流式处理(LINQ to XML)
- 使用linq to xml 快速创建自己的Rss
- 使用Linq to XML创建保存XML
- [导入]使用linq to xml 快速创建自己的Rss 之二 Syndication篇
- 使用Linq to XML来将hardcode在reporting services报表里的label文字变成从数据库取值
- LINQ To Xml:使用XPath
- [代码]使用XmlWriter填充XML树(LINQ to XML)
- 使用Linq to XML遍历XML
- 使用linq to xml 快速创建自己的Rss
- 使用 LINQ to XML
- 使用LinqToXML增删
- Unity上使用Linq To XML——简单易维护的代码
- [代码]使用函数构造创建具有属性的元素(LINQ to XML)
- [代码]使用XSD验证XML示例1(LINQ to XML)
- 使用Linq to XML操作XML的元素