.net - 如何提高 XML 读写性能

标签 .net xml performance

我有两个独立运行的 .NET 应用程序(可以按任何顺序启动,或者可能只运行一个),它们使用 XML 作为数据存储。所以这两个应用程序都可以读取和写入 XML 文件。 为了保持数据更新,我每次在读写操作之前从磁盘加载 XML 文件。我正在使用 XPath 查询来查询特定节点。 现在在这个方法中观察到性能问题,因为一个应用程序每秒都有对 XML 的读写请求(使用轮询,并且无法更改) 我不确定到底是什么导致了性能下降,但我相信它是连续读写的。

我尝试使用 .NET 4.0 中的内存映射文件,但我只能使用 .NET 3.5 而不是任何更高版本。

谁能帮我解决这个问题?

注意:XML 节点有一些共同的属性、不同数量的属性和一个我用于 XPath 查询的 ID。

最佳答案

如果您确定性能影响来自 I/O,并且您不能同时更改这两个应用程序,那么您确实可以做一些事情。

第一个对现有应用程序代码进行零更改的解决方案:使用 RAM disk .如果他们将该文件用作共享内存,您可以在不进行任何其他更改的情况下执行此操作。如果数据是持久性的,您可能需要在每次写入后执行后台复制到另一个媒体。性能不如真正的共享内存,但至少您不必等待缓慢的 I/O 操作。

第二种解决方案仅在必须读取数据的应用程序中进行更改:通常 XML 文件的解析非常慢(特别是如果您使用 XmlDocument 并且文件不是很小) .在这种情况下,使用 XmlReader,你必须让你的读取代码更复杂并且忘记 XPath 查询,但它的性能将比 XmlDocument 好很多倍而且它不会'不要放慢增加文件大小的速度。

小(或不太小)更新:如果可以更改第二个应用程序(我猜是将读取文件的那个)的代码,您可以做一些事情来提高其性能。首先不要每次都读取文件。检查它的时间戳,为该文件或其他任何东西注册一个 FileSystemWatcher 但不要每次都读取/解析文件。执行此操作后,您可以向前迈出一步:仅在文件更改时读取/解析文件,在后台(另一个线程)准备您的 XmlDocument 并使其可用于轮询请求。如果请求是间隔,他们甚至可能会看到非常快的响应时间(但是 XmlDocument 典型文件的 XPath 查询的配置文件性能)。

编辑:here您可以找到 Microsoft 提供的 RAM 磁盘。它非常简单和天真,但通常你/我们不需要的比这更多。此外,它是 DDK 上的示例,因此您也可以获得源代码(在这种情况下......只是为了好玩)。

关于.net - 如何提高 XML 读写性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10971725/

相关文章:

c# - 为什么我的 HTTP Web 请求代码不发送请求?

xml - 使用 XML 作为(只读)人类可读的调查问题数据源

android - 应用程序使应用程序屏幕变慢

xml - 让 JAXB 运行得更快

scala - Scala 与 Python 的 Spark 性能

c# - 防止两个接口(interface)之间的转换

.net - 将 IIS 网站应用程序设置为使用应用程序池身份进行匿名身份验证(通过代码)

c# - 在 Cosmos DB 中存储具有动态属性的对象

iphone - 将具有大量子节点的 XML 解析为 UITableView

android - 按钮 - 单击时更改背景颜色