gpt4 book ai didi

c# - 在 C# 中优化 XML

转载 作者:数据小太阳 更新时间:2023-10-29 01:56:59 25 4
gpt4 key购买 nike

背景

我们有一个从 .NET 1.1 开始的项目,转移到 .NET 2.0,最近又转移到 .NET 3.5。该项目是高度数据驱动的,并且将 XML 用于其许多数据文件。其中一些 XML 文件非常大,我想借此机会改进应用程序与它们的交互。如果可能的话,我想避免必须始终将它们完全保存在内存中,但另一方面,我想快速访问它们的数据。

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

问题

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

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

考虑到我们已经尽可能地缓存数据,这个问题也可以理解为“哪个更快并且使用更少的内存;XmlDocumentXPathDocument、基于XmlReaderXDocument 的解析/LINQ-to-XML ?”

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

例子

一个 XML 文件有一些记录:
<MyXml>
<Record id='1'/>
<Record id='2'/>
<Record id='3'/>
</MyXml>

我们的用户界面想知道是否存在 ID 为 3 的记录。如果可以的话,我们希望无需解析和加载文件中的每条记录即可找到答案。因此,如果它在我们的缓存中,则没有 XML 交互,如果不在,我们可以将该记录加载到缓存中并响应请求。

目标

拥有一种可扩展、快速的查询和缓存 XML 数据文件的方法,以便我们的用户界面能够响应,而无需诉诸多线程或将整个 XML 文件长期保留在内存中。

我意识到某个地方可能有关于此的博客或 MSDN 文章,我将在发布此问题后继续使用 Google,但如果有人有一些可能有用的数据,或者一些何时采用某种方法的示例比另一个更好或更快,那就太好了。


更新
The XMLTeam published a blog today它就何时在 .NET 中使用各种 XML API 提供了很好的建议。看起来基于 XmlReaderIEnumerable 的东西将是我在此处给出的场景的最佳选择。

最佳答案

对于 XML 我只知道两种方式

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

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

关于c# - 在 C# 中优化 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/893875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com