并行 ConcurrentDictionary 计数器

Parallel ConcurrentDictionary counters

这个程序类似于字数统计。

我有一个大文件,每行包含一个键和 2 个数字

我需要按每个键对增量值求和。

所有键都已给出,文本文件不会有任何不在列表中的键。

问题是我每次 运行 使用相同的输入得到不同的总和。

public static ConcurrentDictionary<string, ulong> entries = new ConcurrentDictionary<string, ulong>();
//sequentially load keys into entries 

               ParallelOptions op = new ParallelOptions();
                op.MaxDegreeOfParallelism = nThread;
                Parallel.ForEach(lines, op, (one) =>
                    {
                        string[] parts = one.Split('\t');

                        string key = parts[1];

                        //get length
                        ulong len = Convert.ToUInt64(parts[4]) - Convert.ToUInt64(parts[3]);


                        if (entries.ContainsKey(key))
                        {
                                entries[key] += len;

                        }
                        else
                        {
                            Console.WriteLine("key not found: " + key);
                        }


                    });

通过其索引器访问值不是线程安全的。使用其他方法之一来确保线程安全,例如 AddOrUpdateFunc。然而,您选择哪种方法将完全取决于您的需要

entries.AddOrUpdate(key, len, (s, value) => value + len);

AddOrUpdate(TKey, Func, Func, TArg)

Uses the specified functions and argument to add a key/value pair to the ConcurrentDictionary if the key does not already exist, or to update a key/value pair in the ConcurrentDictionary if the key already exists.

需要注意的是,有时ConcurrentDictionary可能会进入锁,看到读取后值发生变化,再次尝试委托。所以它在其他某些情况下可能会有意想不到的副作用