我有两个独立运行的 .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/