0

我有一个发生超过 50 000 次的事件。每次发生此事件时,我都需要查看一个 xml 文件并获取一些数据。这个 xml 文件有超过 20 000 个可能的值。

在需要阅读我的 xml 之前,50 000 事件的其他工作非常快。一旦我实现了 xml 读取,它就非常显着地减慢了整个操作。

要阅读 XML,我这样做:

 XElement xelement = XElement.Load(SomePath);

        IEnumerable<XElement> elements = xelement.Elements();

        foreach (var element in elements)
        {
            if (element.Element("SomeNode") == value)
            {
                valueToSet = element.Element("SomeOtherNode").Value
                break;
            }
        }

我能做些什么来优化这个?

4

2 回答 2

1

在我看来,您应该加载文件一次,将其预处理为 a Dictionary<string, String>,然后在每次事件发生时在该字典中执行查找。您没有给我们足够的上下文来准确说明您将缓存字典的位置,但这不太可能特别困难。

加载和转换为字典非常简单:

var dictionary = XElement.Load(SomePath)
                         .Elements()
                         .ToDictionary(x => x.Element("SomeNode").Value,
                                       x => x.Element("SomeOtherNode").Value);

这是假设所有次要元素都包含一个SomeNode元素和一个SomeOtherNode元素......如果不是这种情况,您需要先进行一些过滤。

于 2013-07-05T17:04:06.140 回答
0

如果您每次都需要加载(刷新?)文件,您可能需要考虑XStreamingElement,这样您就不必预先加载整个文档(就像 XElement.load 那样)。使用 XElement.Load,您可以将整个 XML 加载到内存中,然后对其进行迭代。使用 XStreaminigElement,您只需将所需的文档量带入内存。此外,要获得第一个匹配项,请使用 .FirstOrDefault。

如果您不需要不断刷新文档,请考虑使用@jonskeet 提供的缓存机制。

于 2013-07-05T17:22:47.387 回答