2012-04-04 25 views
0

我有一个需求来处理1600万条数据库记录,这是要带我永远。我不是很懂线程,所以我想在这里问。我的想法是,我需要执行以下但我不确定如何:线程/ TPL等

  1. 找我16米记录
  2. 拆分这些出成若干“块”
  3. 对发送每个块的处理他们的在线程

这听起来是否正确,我将如何将我的工作量(16m记录)分成等等......?

如果你能提供合理的建议,欢呼声。

+1

有一个问题:你用TPL标记了这个,但也用C#3.0 - 但TPL带有.net4.0 - 所以你应该可以使用C#4.0 - 如果你可能会发现这个:http:// msdn.microsoft.com/de-at/devlabs/gg585582有趣的 – Carsten 2012-04-04 12:33:42

+0

@CarstenKönig,TPL Dataflow适用于更复杂的流程。在这种情况下,我认为这不会有用。 – svick 2012-04-04 13:33:22

+0

好吧...恕我直言,这是一个合理的场景 – Carsten 2012-04-04 13:40:06

回答

1

我建议你使用知名生产者 - 消费者模式以下列方式:

  • 一个单独的线程(生产者)从DB拉记录,创建任务(与单个或许多个记录处理)并将它们放入共享队列中。
  • 一组线程(消费者)从队列中提取任务并并行处理它们。

一个非常简单的实现方法是使用ThreadPool类。它方便地为您管理队列和工作人员。您只需通过QueueUserWorkItem实施生产者和队列任务。

或者,如果您要使用TPL结构,您可以使用Task s和可能是ConcurrentQueue的组合自己实现上述机制。

+1

这有点令人困惑。 TPL构造*是* Produces-Consumer模式的实现 - ConcurrentQueue甚至实现了IProducerConsumer接口。要使用ThredPool,你必须重新实现相同的机制。 – 2012-04-05 07:37:05

1

如果您想要并行处理项目的集合,那正是Parallel.Foreach()的用途。您只需将它传递给您想要为每个项目执行的操作(可能是一个lambda),它将负责将您的集合拆分为块并执行它。

但是您必须小心处理该操作。这是因为代码将在更多的线程上并发执行,所以您不应该以非线程安全的方式访问任何共享状态。