【问题标题】:Faster Update of Dictionary values [closed]字典值的更快更新[关闭]
【发布时间】:2014-04-16 19:46:27
【问题描述】:

我的字典是

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

【问题讨论】:

  • 这段代码不足以确定您的程序运行缓慢的原因。
  • 您可能需要查看帮助中心,了解如何使用Minimal, Complete, and Verifiable Example
  • 很抱歉给您带来不便,因为这是我在这个论坛上的第一个问题。但实际上下面的一些答案对我帮助很大。下次我会尽量详细说明。

标签: c# xml dictionary key


【解决方案1】:

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

我相信这会显着提高性能。

【讨论】:

  • 特别感谢您和其他人推荐 StringBuilder。我的代码现在运行速度明显加快。
【解决方案2】:

在大字符串上执行一些在编译时未知的重复连接是一种天生的浪费。如果您最终将许多值连接在一起,并且它们并不是特别小,那么这可能很容易成为问题的根源。

如果是这样,那将与字典无关。您应该考虑使用StringBuilder,或者构建一个单独的字符串集合,当您拥有该值所需的所有字符串时,您可以使用string.Join 加入这些字符串。

【讨论】:

    【解决方案3】:

    可能想考虑使用 StringBuilders 而不是字符串:

    var d = new Dictionary<string, StringBuilder>();
    

    并附加如下值:

    if (d.ContainsKey(dKey))
    {
        d[dKey].Append("," + ctr);
    }
    else
        d.Add(dKey, new StringBuilder(ctr.ToString()));
    ++ctr;
    

    但我怀疑瓶颈实际上在其他地方。

    【讨论】:

      【解决方案4】:

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

      更多示例herehere

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        • 2021-11-08
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多