C# 搜索内存中的大型集合时出现性能问题
我编写了一个查询,从transitiondata中查找nodedata中的节点,但由于它有400万条记录,所以要走出这个循环需要相当长的时间 我们所拥有的: 1.将有从和到节点的转换数据(收集)。C# 搜索内存中的大型集合时出现性能问题,c#,performance,foreach,C#,Performance,Foreach,我编写了一个查询,从transitiondata中查找nodedata中的节点,但由于它有400万条记录,所以要走出这个循环需要相当长的时间 我们所拥有的: 1.将有从和到节点的转换数据(收集)。 2.节点数据(采集),其键等于过渡数据(采集)中的表单或到节点 从这些集合中需要什么: 1.应具有转换数据(从、到)以及节点数据(从键)和(到键)的相应节点的集合 我写的代码运行良好,但执行起来需要很多时间。下面是代码 foreach (var trans in transitions)
2.节点数据(采集),其键等于过渡数据(采集)中的表单或到节点 从这些集合中需要什么: 1.应具有转换数据(从、到)以及节点数据(从键)和(到键)的相应节点的集合 我写的代码运行良好,但执行起来需要很多时间。下面是代码
foreach (var trans in transitions)
{
string transFrom = trans.From;
string transTo = trans.To;
var fromNodeData = nodeEntitydata.Where(x => x.Key == transFrom).FirstOrDefault();
var toNodeData = nodeEntitydata.Where(x => x.Key == transTo).FirstOrDefault();
if (fromNodeData != null && toNodeData != null)
{
//string fromSwimlane = fromNodeData.Group;
//string toSwimlane = toNodeData.Group;
string dicKey = fromNodeData.sokey + toNodeData.sokey;
if (!dicTrans.ContainsKey(dicKey))
{
soTransition.Add(new TransitionDataJsonObject
{
From = fromNodeData.sokey,
To = toNodeData.sokey,
FromPort = fromPortIds[0],
ToPort = toPortIds[0],
Description = "SOTransition",
IsManual = true
});
dicTrans.Add(dicKey, soTransition);
}
}
}
这就是需要时间来执行的循环。我知道问题出在那两个Where子句中。因为转换将有400k,而nodeEntitydata将有400k。有人能帮我吗?使用直接访问字典条目:
var fromNodeData = nodeEntitydata[transFrom];
var toNodeData = nodeEntitydata[transTo];
看起来,
nodeEntitydata
只是一个普通的集合。您面临的问题是,对内存中的集合执行,其中
,具有线性性能,并且您需要处理大量记录
你需要的是一本字典
。这对于搜索大型集合要有效得多,因为它使用一个数组来进行搜索,而不是线性搜索
如果nodeEntitydata
还不是一个字典
,您可以这样从它创建一个字典:
var nodeEntitydictionary = nodeEntitydata.ToDictionary(n => n.Key);
var fromNodeData = nodeEntitydictionary[transFrom];
var toNodeData = nodeEntitydictionary[transTo];
然后,您可以这样使用字典:
var nodeEntitydictionary = nodeEntitydata.ToDictionary(n => n.Key);
var fromNodeData = nodeEntitydictionary[transFrom];
var toNodeData = nodeEntitydictionary[transTo];
创建字典的速度相当慢,因此请确保只在填充
nodeEntitydata
的位置执行一次。如果您必须频繁地重新实例化词典
,那么您将看不到多少性能优势,因此请确保尽可能多地重用它。注意:aLakh
是印度数字系统中的一个单位。它相当于十进制中的100000
。så400000
是400000
。什么样的收集是nodeEntityData
?