我有一個需求來處理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