【发布时间】:2013-10-18 10:59:05
【问题描述】:
我喜欢 Linq to Xml API。我用过的最简单的一个。
我还记得它是在XmlReader 之上实现的,这是一个非缓存读取器,意思是:
var rdr = XmlReader.Create("path/to/huge_3Gb.xml");
...将立即返回(可能最多读取 xml 标头)。
XDocument.Load() 的documentation 表明它确实使用了XmlReader.Create()。
我希望,就像所有 Linq 一样,我会使用 Linq2Xml 获得延迟执行行为。
但是后来我尝试了这个,就像我通常对涉及文件的任何事情一样:
using(var xdoc = XDocument.Load("file")){ ... }
还有惊喜!它不能编译,因为 XDocument 没有实现 IDisposable!
嗯,这很奇怪!当我使用完XDocument 后,我将如何永远释放文件句柄?
然后我恍然大悟:也许XDocument.Load() 会立即吃掉内存中的整个 Xml(并立即关闭文件句柄)?
所以我尝试了:
var xdoc = XDocument.Load("path/to/huge_3Gb.xml");
等待,等待,然后进程说:
Unhandled Exception: OutOfMemoryException.
所以 Linq to Xml 接近完美(很棒的 API),但没有雪茄(在大型 Xml 上使用时)。
</rant>
我的问题是:
我是否遗漏了什么,有一种方法可以懒惰地使用 Linq to Xml?
如果上一个问题的答案是“否”:
Linq to Xml API 不能具有类似于 Linq to Objects 的延迟行为是否有客观原因?在我看来,至少某些操作(例如,仅转发 XmlReader 可能实现的事情)可以延迟实现。
...或者是不是这样实现的,引用Eric Lippert,
" 因为从来没有人设计、指定、实施、测试过, 记录并发布了该功能”?
【问题讨论】:
标签: c# xml linq linq-to-xml