任务并行库的大数据初始设置模式

时间:2016-11-18 10:29:33

标签: .net parallel-processing task-parallel-library large-data

对于那些希望并行化计算密集型算法的人,让我指出一下利用.NET 4及更高版本的任务并行库的常见模式的文档:https://www.microsoft.com/en-us/download/details.aspx?id=19222

然而,有一种模式,我认为相当普遍,我所拥有的那种模式并没有涵盖在其他令人敬畏的文件......

我说DataTable中有100行,它们在N列中有一组输入,我需要在M列中计算一些输出。每行可以独立计算,因此它似乎是并行化的主要原因。

但是,为了进行这种计算,我需要首先构建一个海量数据结构。一旦构建成一行,我就可以简单地重置它以将其用于另一行。因此,我不想从头开始为每一行重建它...这比重置需要更长的时间。但是并行计算不能共享那个数据结构,因为它们每个都会修改它......相反,它们都需要自己的数据结构。

Soooo,从算法上讲,我需要做的是为每个可用的处理器核心启动一个线程,首先构建自己的海量数据结构。然后它应该计算一行,重置,计算另一行,重置等等,直到没有更多行要计算。

任务并行库具有管理这样一个过程的所有智能......但我还没有找到这种情况的任何示例,我需要每个线程进行大规模数据构建,计算,重置,计算,重置,等等,直到完成。

这似乎是一个相当普遍的模式......任何人都可以向我指出.NET 4及更高版本的任务并行库如何支持该模式的一个例子吗?

1 个答案:

答案 0 :(得分:0)

我想出的最佳答案是...... 如果你有更好的......请告诉我。或者如果你能看到这方面的缺陷......

我想我需要调用Parallel.For(0,Environment.ProcessorCount,...)并让代码构建基本结构然后通过在共享rowIndex上执行Interlocked.Increment来开始处理行,直到所有行都是处理。

通过这种方式,基本结构最多为每个处理器构建一次,然后重用...但如果开始消耗太多内存或其他资源,则Parallel.For可以选择运行少于Environment.ProcessorCount任务一次。真?

有更好的方法吗?