【问题标题】:Parallelizing producer and consumer with internal state将生产者和消费者与内部状态并行化
【发布时间】:2016-03-25 00:24:15
【问题描述】:

我想知道以下方法是否是在 C# .NET 4.6.1 中实现生产者和消费者模式的好方法

我想做什么的描述:
我想读取文件,对其中的数据进行计算并保存结果。每个文件都有一个来源(一个设备,例如数据记录器),并且根据该来源,应该使用不同的计算和输出格式。该文件包含不同的值,例如几个传感器的温度读数。重要的是计算有一个状态。例如,这可能是先前计算的最后一个值,例如如果我想对一个来源的所有值求和。 我想并行化每个来源的处理。来自一个来源的所有文件都需要按顺序(或更具体地按时间顺序)处理,并且不能并行化。

我认为 TPL 数据流可能是一个合适的解决方案。

这是我想出的过程:
阅读将由TransformBlock 完成。接下来,我将创建对每个来源的数据执行操作的类的实例。他们使用必要的参数进行初始化,以便他们知道如何处理文件的来源。 然后我会为每个创建的对象创建TransformBlocks(基本上是每个来源)。每个TransformBlocks 都会执行对应对象的一个​​函数。 TransformBlock 读取文件 将链接到BufferBlock,该BufferBlock 链接到每个TransformBlock 以进行每个来源的处理linking would be conditional,以便只接收旨在到达源的处理TranformBlock 的数据。处理块的输出将与ActionBlock 链接,用于编写输出文件。
对于每个 Block,maxDegreeOfParallelism 设置为 1。

这是一个可行的解决方案吗?我考虑过使用 Tasks 和 BlockingCollection 来实现这一点,但似乎这将是更简单的方法。

附加信息:

处理的文件数量可能很大或一次加载的数量很大。 读取和写入应该与处理同时发生。由于 I/O 需要时间,并且需要在处理后收集数据以形成输出文件,因此缓冲是必不可少的。

【问题讨论】:

  • 如果这更适合programmers.stackexchange.com,请随意迁移。
  • 什么时候知道起源?是立即知道还是仅在读取文件后才知道?
  • 条件链接的问题是它的成本与源的数量成正比。
  • @usr 在通过位置和文件名读取文件之前,“来源”是已知的。
  • @usr 对性能有那么糟糕吗?有什么替代方案?

标签: c# .net task-parallel-library


【解决方案1】:

由于来源是独立的,并且每个来源的项目完全依赖,这个问题有一个简单的解决方案:

var origins = (from f in files
               group f by f.origin into g
               orderby g.Count() descending
               select g);

 var results =
 Partitioner.Create(origins) //disable chunking
 .AsParallel()
 .AsOrdered() //try process the biggest groups first
 .Select(originGroup => {
  foreach (var x in originGroup.OrderBy(...)) Process(x);
  return someResult;
 })
 .ToList();

按顺序处理每个原点并并行处理。

如果您需要限制 IO,可以通过某种方式输入 SemaphoreSlim 来保护 IO 路径。

【讨论】:

  • 在 orginGroup 中有一个订单(按时间顺序),所以我认为 add 和 OrderBy
  • 嗯,这似乎是一个简单的解决方案。我会通过 BlockingCollection 管理文件输出,对吗?
  • @Paparazzi 有并发 I/O 并且没有溢出内存?​​
  • 我添加了一种可以用来轻松收集一些输出的方法。 PLINQ 非常适合数据流管道。您也可以直接从 Select 写入文件。
  • @John 但 originGroup 是按顺序处理的,而您是询问如何并行起源的人。抱歉,我帮不上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多