2013-04-30 49 views
-1

好吧,這已經有一段時間了,因爲我真的不得不動用大量線程。線程處理C#中的大集合

基本上的情況是:

我有一個數據庫查詢的大集合,說過分,一個百萬行已返回並儲存某種(數組列表,地圖等)的收藏。我希望能夠將這個集合分解並在線程,進程等之間進行劃分,以便高效地完成工作。但我不想將整個集合均勻分成不同的過程。我想說10個線程,每個線程可以工作30行,當他們完成處理時,他們會從原始集合中獲取更多行。

這是想到解決這個問題的第一件事。我不知道該集合如何動態分配給線程看起來像。我最終會收集所有單獨的流程結果並將它們編譯爲另一個將用於未來處理的集合。我知道查詢結果將會是非常多的行,並且認爲最初動態地將部分分配給線程並在他們完成任務時將是處理這種情況的最佳方式。

這是一個兩部分問題。一,會怎麼說...僞碼看起來像這樣?和二,這是處理這種情況的最好方法嗎?

任何幫助將不勝感激。哦,我正在考慮在C#中爲此工作。

謝謝!

+1

您不希望在CPU中創建比核心更多的線程。所以10個線程將主要是太多。查看此鏈接以獲取一些提示和代碼示例:http://msdn.microsoft.com/en-us/magazine/cc163340.aspx – TcKs 2013-04-30 20:36:29

回答

1

我想象PLINQ(並行Linq)是明顯的選擇。來自MSDN的簡單示例:

var source = Enumerable.Range(1, 10000); 


// Opt-in to PLINQ with AsParallel 
var evenNums = from num in source.AsParallel() 
       where Compute(num) > 0 
       select num; 

這通常假定您的收集和處理中的所有項目都是獨立的。另一種選擇可能是用於更高級操作的TPL(任務並行庫)。以下是TPL的一個不錯的raytracer示例。

0

您可以有一個方法負責分發列表的各個部分,然後使各工作線程在完成當前工作時請求一個部分。管理器方法必須是線程安全的,但除此之外它幾乎都是自己構建的。