Параллельные счетчики ConcurrentDictionary - PullRequest
0 голосов
/ 15 января 2019

эта программа похожа на количество слов.

У меня большой файл, каждая строка содержит ключ и 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);
                        }


                    });

1 Ответ

0 голосов
/ 15 января 2019

Доступ к значению по его индексатору не является потокобезопасным. Вместо этого используйте один из других методов, обеспечивающих безопасность резьбы, например от AddOrUpdate до Func. Однако, какой подход вы выберете, будет полностью зависеть от ваших потребностей

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

AddOrUpdate (TKey, Func, Func, TArg)

Использует указанные функции и аргумент для добавления пары ключ / значение в ConcurrentDictionary, если ключ еще не существовать или обновить пару ключ / значение в ConcurrentDictionary, если ключ уже существует.

Следует отметить, что иногда ConcurrentDictionary может войти в блокировку, увидеть, что значение изменилось с момента его чтения, и снова попробовать делегата. Так что это может иметь неожиданные побочные эффекты в других определенных ситуациях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...