我的字典是
Dictionary<string, string> d = new Dictionary<string, string>();
我遍历XML文件(非常大)并在字典中保存键/值对。
以下代码快照执行速度非常慢,我想让它更快。我的ctr值达到3332130需要大约一个多小时才能完成。
if (d.ContainsKey(dKey))
{
dValue = d[dKey];
d[dKey] = dValue + "," + ctr;
}
else
d.Add(dKey, ctr.ToString());
ctr++;
答案 0 :(得分:0)
在大型字符串上执行编译时未知的多个重复连接本身就是浪费的事情。如果你最终将很多值结合在一起,并且它们不是特别小,那么很容易成为问题的根源。
如果是这样,它与字典没有任何关系。您应该考虑使用StringBuilder
,或者建立一组单独的字符串,当您拥有该值所需的所有字符串时,可以使用string.Join
加入这些字符串。
答案 1 :(得分:0)
3332130
是一个存储在内存中的大数字,你不应该在内存中保存这么大的集合。
据说,让我们尝试优化它。
Dictionary<string, StringBuilder>() d = new Dictionary<string, StringBuilder>();
StringBuilder builder;
if (d.TryGetValue(dKey, out builder))
{
builder.Append(",");
builder.Append(ctr);
}
else
{
d.Add(dKey, new StringBuilder(ctr.ToString()));
}
StringBuilder
而不是TryGetValue
可以避免拨打dValue = d[dKey];
。 我认为这会显着提高效果。
答案 2 :(得分:0)
你可能想要考虑使用StringBuilders而不是字符串:
var d = new Dictionary<string, StringBuilder>();
并附加如下值:
if (d.ContainsKey(dKey))
{
d[dKey].Append("," + ctr);
}
else
d.Add(dKey, new StringBuilder(ctr.ToString()));
++ctr;
但我怀疑瓶颈实际上是在其他地方。
答案 3 :(得分:0)