C# 并行处理#

C# 并行处理#,c#,parallel-processing,parallel.foreach,C#,Parallel Processing,Parallel.foreach,我使用的是4核处理器。我正在使用Parallel.Foreach概念实现一个场景。我在数据库中有一个很大的记录集。使用这个并行处理概念,我试图更新这些记录中的一些值 我已将记录集合划分为小子集和更新 方法1:-我将集合划分为4个子集(因为我有4个核心),并进行并行处理 但我在想,如果我把收藏分成更多的子集(比如100个),我的记录是否会更新得更快 我的理解是记录不会更新得更快,因为我只有4个内核,而且这种方法使用了上下文切换概念。因此,与第一种方法相比,产生的时间将更多 请确认。并行。For已将

我使用的是4核处理器。我正在使用
Parallel.Foreach
概念实现一个场景。我在数据库中有一个很大的记录集。使用这个并行处理概念,我试图更新这些记录中的一些值

我已将记录集合划分为小子集和更新

方法1:-我将集合划分为4个子集(因为我有4个核心),并进行并行处理

但我在想,如果我把收藏分成更多的子集(比如100个),我的记录是否会更新得更快

我的理解是记录不会更新得更快,因为我只有4个内核,而且这种方法使用了上下文切换概念。因此,与第一种方法相比,产生的时间将更多


请确认。

并行。For
已将每个迭代安排到不同的核心(如果可用)。您不需要将数据划分为子集来获得并行性

对我来说,这里的主要瓶颈不是你的CPU,而是你在使用数据库。大多数RDMS和NoSQL引擎设计用于高需求场景,但您的命令仍然需要通过线路到达数据库服务器


如果我没有弄错的话,您应该打开多个池数据库连接,并且每个并行迭代应该向其中一个数据库连接发出命令。也就是说,这将确保您也能够并行发送数据库命令。

并行。For
已经将每个迭代调度到不同的核心(如果可用)。您不需要将数据划分为子集来获得并行性

对我来说,这里的主要瓶颈不是你的CPU,而是你在使用数据库。大多数RDMS和NoSQL引擎设计用于高需求场景,但您的命令仍然需要通过线路到达数据库服务器


如果我没有弄错的话,您应该打开多个池数据库连接,并且每个并行迭代应该向其中一个数据库连接发出命令。也就是说,这将确保您也能够并行发送数据库命令。

我不太担心自己对数据进行分区。.NET在封面下对并行循环使用自适应分区,这对于大多数情况(如果不是所有情况)应该足够了,还没有遇到过一个在现实生活中需要自定义分区器的情况

对于.NET中的并行处理,请记住,如果循环很长(即等待I/O绑定操作或进行长时间计算的时间超过1秒),您可能会看到工作线程数量激增。NET线程池无法区分所有线程被阻塞的情况和线程实际正在工作的情况,因此它开始注入线程以避免线程不足。这可能不是你需要的。您可以使用
ParallelOptions.MaxDegreeOfParallelism
属性限制并发线程


如果并行循环正在执行I/O调用,我通常建议为所有I/O操作创建任务,并在最后通过
Task.whalll
等待所有I/O操作。在这种情况下,您甚至不需要任何并行性,因为您只是创建表示I/O请求的任务,因此您甚至可以按顺序创建这些任务并在最后等待它们。

我不太担心自己对数据进行分区,NET在后台为并行循环使用自适应分区,这对于大多数情况(如果不是所有情况的话)应该足够了,但在现实生活中还没有遇到过需要自定义分区器的情况

对于.NET中的并行处理,请记住,如果循环很长(即等待I/O绑定操作或进行长时间计算的时间超过1秒),您可能会看到工作线程数量激增。NET线程池无法区分所有线程被阻塞的情况和线程实际正在工作的情况,因此它开始注入线程以避免线程不足。这可能不是你需要的。您可以使用
ParallelOptions.MaxDegreeOfParallelism
属性限制并发线程


如果并行循环正在执行I/O调用,我通常建议为所有I/O操作创建任务,并在最后通过
Task.whalll
等待所有I/O操作。在这种情况下,您甚至不需要任何并行性,因为您只是创建表示I/O请求的任务,因此您甚至可以按顺序创建这些任务,并在最后等待它们。

这取决于具体情况。您的例程不仅涉及4核CPU,还涉及RDBMS(数据库)和网络。例如(我的例子):
2核CPU
,1Gb网络,32 CPU superdome(带有Oracle 11.2 RDBMS)在夜间约30个线程,白天约10个线程时显示出最佳性能。您的问题非常主观,很大程度上取决于机器上运行的底层硬件和其他进程。唯一知道的方法是通过实现一些基本的诊断来测试它,以测量性能,同时增加子集的数量。目前还不清楚您试图执行哪种处理。如果可能的话,在数据库中进行所有处理,使用将数据作为一个集合处理的查询,而不是考虑单个行/更新。这就是数据库设计的处理方式。这要看情况而定。您的例程不仅涉及4核CPU,还涉及RDBMS(数据库)和网络。例如(我的例子):
2核CPU
,1Gb网络,32 CPU superdome(带有Oracle 11.2 RDBMS)在夜间约30个线程,白天约10个线程时显示出最佳性能。您的问题非常主观,很大程度上取决于机器上运行的底层硬件和其他进程。唯一知道的方法是通过实现一些基本诊断来测试它,以测量性能,同时增加子集的数量