C#,Parallel并行多线程计算,使用专门的Concurrent系列数据集

常规的 Hashtable 在并行计算时,会出现冲突错误!

Concurrent*** 是适合于并行计算的数据集系列

https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent?view=net-9.0

提供多个线程安全的集合类,这些类应在多个线程同时访问集合时代替 System.CollectionsSystem.Collections.Generic 命名空间中的相应类型。

但是,不保证通过扩展方法或通过显式接口实现访问集合对象的元素是线程安全的,并且可能需要由调用方同步。

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| BlockingCollection<T> | 为实现 IProducerConsumerCollection<T>的线程安全集合提供阻塞和边界功能。 |
| ConcurrentBag<T> | 表示对象的线程安全无序集合。 |
| ConcurrentDictionary<TKey,TValue> | 表示可同时由多个线程访问的键/值对的线程安全集合。 |
| ConcurrentQueue<T> | 表示线程安全的先出 (FIFO) 集合。 |
| ConcurrentStack<T> | 表示线程安全最后一次传入 (LIFO) 集合。 |
| OrderablePartitioner<TSource> | 表示将可排序数据源拆分为多个分区的特定方式。 |
| Partitioner | 为数组、列表和可枚举提供常见的分区策略。 |
| Partitioner<TSource> | 表示将数据源拆分为多个分区的特定方式。 |

cs 复制代码
ConcurrentDictionary<string, int>[] hash = new ConcurrentDictionary<string, int>[N];
for (int i = 0; i < N; i++) hash[i] = new ConcurrentDictionary<string, int>();
// 并行计算方法
Parallel.For(0, records.Count, i =>
{
    EMRRecord emr = records[i];
    EMRInfo eri = new EMRInfo();
    eri.split_to_chapters(emr);
    foreach (EMRChapter ch in eri.chapters)
    {
        int div = division_by_name(ch.name);
        if (div < 0) continue;
        if (div >= N) continue;
        for (int j = 0; j < ch.content.Length; j++)
        {
            string s1 = ch.content.Substring(j, 1);
            if (Char.IsLetter(s1[0]) || StringHelper.IsChinese(s1))
            {
                if (!hash[div].ContainsKey(s1))
                {
                    hash[div].TryAdd(s1, 1);
                }
                else
                {
                    hash[div][s1] = (int)hash[div][s1] + 1;
                }
            }
        }
    }
});
相关推荐
朱嘉鼎20 分钟前
C语言之可变参函数
c语言·开发语言
北冥湖畔的燕雀3 小时前
C++泛型编程(函数模板以及类模板)
开发语言·c++
QX_hao5 小时前
【Go】--map和struct数据类型
开发语言·后端·golang
你好,我叫C小白5 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
Evand J6 小时前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl
爱喝白开水a7 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway8 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康8 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
杰克尼8 小时前
JavaWeb_p165部门管理
java·开发语言·前端
一成码农8 小时前
JavaSE面向对象(下)
java·开发语言