【问题标题】:TPL dataflow and BatchJoinBlock with different batch sizes具有不同批量大小的 TPL 数据流和 BatchJoinBlock
【发布时间】:2014-01-17 11:06:48
【问题描述】:

假设我有一些来自 2 个不同来源的 2 个不同频率的数据,我必须将它们加入并一起处理。通道 A 的频率为 100Hz(每秒 100 个整数),而通道 B 的频率为 1Hz(每秒 1 个整数)。已使用 TPL 数据流中的 ActionBlock 在每个单独的通道上处理数据。但是现在,我必须一起处理它(一次来自 A 的 1000 个 int 和来自 B 的 5 个 int)。对我来说,解决方案是使用 BatchJoinBlock 加入这些块,等待来自通道 A 的 1000 条消息(1000 个整数)和来自通道 B 的 5 条消息(5 个整数)。填充批次后,将其触发到操作块并处理。

问题是 - 根据文档,BatchJoinBlock (MSDN) 将始终具有相同大小的所有批次。

我怎样才能绕过不同的尺寸?

作为替代方案,我可能可以创建 2 个不同大小的不同 BatchBlock 对象,然后将它们触发到 JoinBlock,后者又会将数据发送到 ActionBlock;但这似乎有点矫枉过正,还是一种常见的方法?

我没有发布任何代码,因为现在这些都是我正在考虑的纯理论方法,然后我开始实现两个不同通道的连接。如果需要,我可以快速敲出一些例子。

【问题讨论】:

  • 我认为你的 2 个不同的 BatchBlock 想法是最好的选择。我没有什么要补充的。

标签: c# .net parallel-processing task-parallel-library tpl-dataflow


【解决方案1】:

您几乎已经自己想通了。 BatchJoinBlock 适用于您有两种类型并且需要特定大小的批次的情况,将两种类型的项目计数到相同大小。

例如,如果一种类型是成功的,而第二种类型是失败的。如果您想创建批次 n 个结果,无论有多少是成功的,有多少是失败的,您都可以使用BatchJoinBlock

我相信没有一个块可以完全满足您的要求的原因是因为您可以从两个BatchBlocks 和一个JoinBlock 构建相同的功能。 Dataflow 的优势在于组合各种块,所以我认为这正是你应该做的。 (您不能从其他现有块构建BatchJoinBlock。)

【讨论】:

  • 谢谢,对正确方法的确认令人放心。你很好地解释了原因。
猜你喜欢
  • 2015-03-23
  • 2019-03-24
  • 1970-01-01
  • 2019-02-24
  • 2021-10-25
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多