优化XML阅读

时间:2013-07-05 16:55:16

标签: c# xml linq

我发生了超过5万次的事件。每次发生此事件时,我都需要查看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;
            }
        }

我可以做些什么来优化它?

2 个答案:

答案 0 :(得分:1)

听起来我应该加载文件一次,将其预处理到Dictionary<string, String>,然后每次事件发生时只在该字典中执行查找。你还没有给我们足够的背景来准确说出你在哪里缓存字典,但这不太可能特别很难。

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

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

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

答案 1 :(得分:0)

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

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