在C#中优化XML

Jef*_*tes 5 c# xml linq-to-xml .net-3.5

背景

我们有一个在.NET 1.1中启动的项目,转移到.NET 2.0,最近再次移动到.NET 3.5.该项目极其数据驱动,并为其许多数据文件使用XML.其中一些XML文件非常庞大,我想借此机会改进应用程序与它们的交互.如果可能的话,我想避免在任何时候都将它们完全保存在内存中,但另一方面,我想快速访问它们的数据.

当前设置使用XmlDocumentXPathDocument(取决于它何时写入和由谁编写).首次请求并在内部数据结构中缓存数据(而不是XML,在大多数情况下会占用更多内存).在过去,这是一个很好的模型,因为它具有快速访问时间和低内存占用(或至少,令人满意的内存占用).然而,现在有一个功能可以一次性查询大部分信息,而不是我们之前拥有的很好分散的请求.这会导致XML加载,验证和解析成为性能的可见瓶颈.

给定一个大型XML文件,在没有内存中的XML的情况下,重复查询其内容(例如,"具有id = B的元素A是否存在?")的最有效和响应方式是什么?

请注意,如果我们可以提供帮助,数据本身可以在内存中,而不是在更臃肿的XML格式中.在最坏的情况下,我们可以接受加载到内存中的单个文件进行解析,然后再次卸载以释放资源,但我想尽可能避免这种情况.

考虑到我们已经在尽可能地缓存数据,这个问题也可以被解读为"哪个更快并且使用更少的内存; XmlDocument,XPathDocument基于XmlReaderXDocument/ LINQ-to-XML进行解析?"

编辑:更简单,我们可以随机访问磁盘上的XML而无需一次读取整个文件吗?

XML文件有一些记录:

<MyXml>
  <Record id='1'/>
  <Record id='2'/>
  <Record id='3'/>
</MyXml>
Run Code Online (Sandbox Code Playgroud)

我们的用户界面想知道是否存在id为3的记录.如果可以的话,我们想要找出而不必解析并加载文件中的每条记录.因此,如果它在我们的缓存中,则没有XML交互,如果不是,我们可以将该记录加载到缓存中并响应请求.

目标

使用可扩展,快速的方式查询和缓存XML数据文件,以便我们的用户界面能够响应,而无需借助多个线程或将整个XML文件长期保留在内存中.

我认识到,有可能是在这个地方博客或MSDN文章,我会继续我谷歌已经发布了这个问题后,但如果任何人有一些数据,也许会有帮助,或者一种方法是好还是一些例子比另一个更快,那将是伟大的.


更新
XMLTeam今天发布了一个博客,提供了关于何时在.NET中使用各种XML API的很好的建议.它看起来像是基于的东西,XmlReader并且IEnumerable是我在这里给出的场景的最佳选择.

mca*_*orn 2

对于 XML 我只知道两种方法

XMLReader -> 将大型 XML 数据流式传输或使用 XML DOM 对象模型并将整个 XML 立即读入内存。

如果 XML 很大,我们的 XML 文件大小为 80 MB 及以上,则将 XML 读入内存会对性能造成影响。没有真正的方法可以“合并”处理 XML 文档的两种方法。对不起。