我发生了超过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;
}
}
我可以做些什么来优化它?
答案 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提供的缓存机制。