更快地更新字典值

时间:2014-04-16 19:46:28

标签: c# xml dictionary key

我的字典是

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++;

4 个答案:

答案 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()));
}
  1. 紧密循环中的字符串连接非常慢,请使用 StringBuilder而不是
  2. 使用TryGetValue可以避免拨打dValue = d[dKey];
  3. 我认为这会显着提高效果。

答案 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)

除了字符串连接增强功能外,您还可以将XML拆分为多个数据集,然后与它们并行填充 ConcurrentDictionary 。根据您使用的数据和框架,性能可能会增加。

更多示例herehere