【问题标题】:TPL Dataflow design for pipelining 4 blocks asynchronously用于异步流水线化 4 个块的 TPL 数据流设计
【发布时间】:2013-01-29 12:47:39
【问题描述】:

这是一个关于TPL Dataflow ProducerConsumer Pattern 的新问题,Svick 已经回答了。

  1. 我需要并行处理4个2gb的文件,需要逐个缓冲区读取文件内容缓冲区。 (这里使用生产者模式。Maxdegreeofparallelism = 4,我可以一次发布 4 个缓冲区)
  2. 需要处理缓冲区并写入中间表。 (此处使用消费者模式。)
  3. 内存中的数据表将根据业务规则进行转换并写入规范化表。
  4. 内存中的数据再次被重新用于对最终版本的数据进行更多验证。

目前,第 3 步和第 4 步未使用任何块。它通过消费者的顺序函数调用。

  1. 这个设计正确吗?
  2. 除了使用生产者消费者方法之外,还有什么方法可以将 4 个块逐个流水线并并行处理所有这些块?您能帮我提供一个小示例代码吗?

【问题讨论】:

  • 您只有 4 个文件要处理吗?为什么选择生产者消费者模式?
  • 一次我可能需要处理 4 到 8 个文件。我可能每天都会在预定的时间间隔内获得增量文件。生产者消费者模式主要用于排队和处理来自文件的记录缓冲区。
  • 为什么要排队记录而不是在并行步骤 1 中处理它们?
  • @Balm- 一次处理一个文件。将 50 条记录读入缓冲区并移交给处理和转换。处理和转换将花费比阅读更长的时间。我试图在这里的每个阶段引入并行性。使用 bufferblock 并行读取“n”个记录缓冲区,并异步发送到操作块以进行“n”并行度的处理和转换。欢迎您提出宝贵建议。
  • 好吧,我只是没想到写入中间表会花费更长的时间。那个中间表是什么?如果您使用的是 DataTables,那么请看一下 - 它们很慢!

标签: .net task-parallel-library tpl-dataflow


【解决方案1】:

您的设计似乎是正确的,但很难从像这样的简短描述中说出来。

如果要在 TDF 中创建管道,通常的方法是使用一些IPropagatorBlock,最有可能的是TransformBlock

TransformBlock 在为块的每个输入生成单个输出时有效。但在你的情况下似乎不是这样,所以你可能想使用TransformManyBlock,它可以为每个输入产生任意数量的输出(包括 0 或 1)。

另一种选择是在创建输出时直接Post()(或await SendAsync())到以下块。

【讨论】:

  • 这里给出详细要求:stackoverflow.com/questions/13756717/…
  • 您能提供一些示例代码吗?否则任何有用的链接也可以。
  • @user1884330 我相信很多关于 TDF 的教程都会有 TransformBlock 的示例用法。你看过其中一些吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 2022-07-14
  • 2013-03-29
相关资源
最近更新 更多