2013-04-30 2 views
-1

Хорошо, прошло немного времени, так как мне действительно пришлось использовать много потоков динамически.Обработка потоков большая коллекция в C#

В принципе ситуация:

У меня есть большая коллекция из запроса к базе данных, скажем, чрезмерно, 1 миллион строк были возвращены и хранятся в коллекции своего рода (ArrayList, карта, и т.д.). Я хотел иметь возможность взять эту коллекцию и разделить ее между потоками, процессами и т. Д., Поэтому работа может быть выполнена эффективно. однако я не хочу равномерно разделить всю коллекцию на разные процессы. Я хочу сказать, 10 потоков, которые работают на 30 строк каждый, и когда они будут обрабатывать то, что у них есть, они захватывают больше строк из исходной коллекции.

Это первое, что пришло на ум, чтобы решить эту проблему. Я не уверен, как будет выглядеть динамическое распределение коллекции в потоках. В конечном итоге я захочу собрать все результаты отдельных процессов и скомпилировать их в другую коллекцию, которая будет использоваться для дальнейшей обработки. Я знаю, что результаты запроса будут очень большим количеством строк и подумали бы, что динамическое назначение частей для потоков изначально и по завершении их задач было бы лучшим способом справиться с этим.

Это вопрос двух частей. Во-первых, что бы ... сказать ... псевдо-код выглядит для этого? и два, это лучший способ справиться с этой ситуацией?

Любая помощь была бы принята с благодарностью. О, и я думаю о работе на C# для этого.

Спасибо!

+1

Вы не хотите создавать больше потоков, чем ядра в CPU. Таким образом, 10 потоков будут в основном слишком много. Посмотрите на эту ссылку для некоторых советов и примеров кода: http://msdn.microsoft.com/en-us/magazine/cc163340.aspx – TcKs

ответ

1

Полагаю, что PLINQ (Parallel 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 (параллельная библиотека задач) для более сложных операций. Вот хороший пример raytracer для TPL.

0

У вас может быть метод, ответственный за раздачу разделов списка, а затем сделать отдельные рабочие потоки запрашивающими раздел, когда они будут выполнены с их текущим. Метод менеджера должен быть потокобезопасным, но кроме этого он в значительной степени строит себя.

Смежные вопросы