С помощью PLINQ, как я могу установить предпочтительный размер куска при использовании AsParallel (). MaxDegreeOfParallelism (4)? - PullRequest
0 голосов
/ 31 октября 2011

У меня есть список с тысячами объектов, для которых выполняется операция, которая может занять от 1 до 3 минут. Я, конечно, использую PLINQ, но я заметил, что при приближении к концу списка ввода работает только одно ядро, как если бы разделение было определено ex ante.

Итак, с IList, каков наилучший способ заставить PLINQ продолжать использовать рабочие потоки, пока есть элементы для обработки? На компьютере достаточно аппаратных ядер.

Ссылки:

1 Ответ

2 голосов
/ 31 октября 2011

Насколько я понимаю, PLINQ выберет разбиение на диапазоны или порции в зависимости от того, является ли исходная последовательность IList или нет.Если это IList, границы известны, и элементы могут быть доступны по индексу, поэтому PLINQ выбирает разбиение по диапазонам для равномерного разделения списка между потоками.Например, если в вашем списке 1000 элементов и вы используете 4 потока, каждый поток будет обрабатывать 250 элементов.С другой стороны, если исходной последовательностью является , а не и IList, PLINQ не может использовать разбиение диапазонов, поскольку не знает, какими будут диапазоны;поэтому вместо него используется разбиение на куски.

В вашем случае, если у вас есть IList, и вы хотите принудительно создать разбиение на куски, вы можете просто сделать его похожим на простое IEnumerable: вместо записи этого

list.AsParallel()...

Напишите, что:

list.Select(x => x).AsParallel()...

Фиктивная проекция скрывает тот факт, что источник на самом деле IList, поэтому PLINQ будет использовать разбиение на фрагменты.

...