В чем разница между ForAll и Select в PLINQ - PullRequest
0 голосов
/ 27 апреля 2019

В предисловии к PLINQ документы, похоже, показывают два разных способа получения данных из неупорядоченного процесса.В одном случае AsParallel может использоваться с Unsorted и методом Select или SelectMany.SelectMany говорит, что

Проецирует параллельно каждый элемент последовательности в IEnumerable и объединяет результирующие последовательности в одну последовательность.

Таким образом, чтобы получить список возврата из функцииЯ называю это так:

def genGraph(node,constData):
    #do something
    return (constData+1,constData+2,constData+3)

newGraph = Graph.AsParallel().SelectMany(lambda node: genGraph(node,constData) ).ToList()

Другим способом будет использование ForAll и ConcurrentBag, которые добавляются, но ничего не возвращается.

Для более быстрого выполнения запроса, когда сохранение заказа не требуется и когда обработка результатов сама может быть распараллелена, используйте метод ForAll для выполнения запроса PLINQ.

def genGraph(node,constData,newGraph):
    #do something
    newGraph.Add(constData+1,constData+2,constData+3)

newGraph = Concurrent.ConcurrentBag[type((0,0,0))]()
Graph.AsParallel().ForAll(lambda node: genGraph(node,constData,newGraph) )

Итак, первый говорит, что он проецируется параллельно IEnumerable, а второй говорит, что он быстрее, когда обработка может быть распараллелена.Это звучит для меня то же самое.В моем коде он в настоящее время выполняется столько же времени, но мне интересно, есть ли другой случай, который я не понимаю.

...