我有一个需求来处理1600万条数据库记录,这是要带我永远。我不是很懂线程,所以我想在这里问。我的想法是,我需要执行以下但我不确定如何:线程/ TPL等
- 找我16米记录
- 拆分这些出成若干“块”
- 对发送每个块的处理他们的在线程
这听起来是否正确,我将如何将我的工作量(16m记录)分成等等......?
如果你能提供合理的建议,欢呼声。
我有一个需求来处理1600万条数据库记录,这是要带我永远。我不是很懂线程,所以我想在这里问。我的想法是,我需要执行以下但我不确定如何:线程/ TPL等
这听起来是否正确,我将如何将我的工作量(16m记录)分成等等......?
如果你能提供合理的建议,欢呼声。
我建议你使用知名生产者 - 消费者模式以下列方式:
一个非常简单的实现方法是使用ThreadPool
类。它方便地为您管理队列和工作人员。您只需通过QueueUserWorkItem
实施生产者和队列任务。
或者,如果您要使用TPL结构,您可以使用Task
s和可能是ConcurrentQueue
的组合自己实现上述机制。
这有点令人困惑。 TPL构造*是* Produces-Consumer模式的实现 - ConcurrentQueue甚至实现了IProducerConsumer接口。要使用ThredPool,你必须重新实现相同的机制。 – 2012-04-05 07:37:05
如果您想要并行处理项目的集合,那正是Parallel.Foreach()
的用途。您只需将它传递给您想要为每个项目执行的操作(可能是一个lambda),它将负责将您的集合拆分为块并执行它。
但是您必须小心处理该操作。这是因为代码将在更多的线程上并发执行,所以您不应该以非线程安全的方式访问任何共享状态。
有一个问题:你用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
@CarstenKönig,TPL Dataflow适用于更复杂的流程。在这种情况下,我认为这不会有用。 – svick 2012-04-04 13:33:22
好吧...恕我直言,这是一个合理的场景 – Carsten 2012-04-04 13:40:06