Вложенные параллельные запросы - PullRequest
4 голосов
/ 04 октября 2010

Есть ли проблемы с выполнением вложенных запросов PLINQ?

Например:

//Contains roughly 7000+ elements
mycollections.AsParallel().ForAll(x => { 

  //contains 12 elements
  anothercollection.AsParallel().ForAll(y => { 
     //download some data from the web and parse it
  });
});

1 Ответ

6 голосов
/ 04 октября 2010

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

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

  • Если внешняя коллекция достаточно мала, вам также понадобится внутренний цикл, чтобы вы создали достаточный потенциал для распараллеливания (генерируйте достаточно задач для PLINQ,так что он может сбалансировать выполнение)

  • Если внешняя коллекция содержит большое количество элементов, то внутренний цикл, скорее всего, не нужен, потому что одного внешнего цикла достаточно, чтобы дать PLINQ достаточнопространство для распараллеливания.Фактически, внутренний цикл может только увеличивать накладные расходы (хотя, по моему опыту, это происходит только с очень большим количеством элементов)

Кроме того, если вы собираетесь распараллеливатьтолько один цикл, он должен быть внешним.Таким образом, всю работу можно разделить сразу, и вы будете подвергаться распараллеливанию только один раз.

...