并行 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);
}
});
通过其索引器访问值不是线程安全的。使用其他方法之一来确保线程安全,例如 AddOrUpdate
到 Func
。然而,您选择哪种方法将完全取决于您的需要
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
可能会进入锁,看到读取后值发生变化,再次尝试委托。所以它在其他某些情况下可能会有意想不到的副作用
这个程序类似于字数统计。
我有一个大文件,每行包含一个键和 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);
}
});
通过其索引器访问值不是线程安全的。使用其他方法之一来确保线程安全,例如 AddOrUpdate
到 Func
。然而,您选择哪种方法将完全取决于您的需要
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
可能会进入锁,看到读取后值发生变化,再次尝试委托。所以它在其他某些情况下可能会有意想不到的副作用