Какие из списков, массивов или последовательностей более эффективны для параллельной обработки и могут легко реализовывать параллельные операции, такие как parmap
, parfilter
и т. Д.?
РЕДАКТИРОВАТЬ: Спасибо запредложения.Array.Parallel
выглядит как хороший вариант.Также проверено PSeq.fs
, и у меня есть вопрос о том, как работает pmap
ниже.
let pmap f xs =
seq { for x in xs -> async { return f xs } }
|> Async.Parallel
|> Async.RunSynchronously
Создается ли новый поток для каждого элемента в последовательности?Если да, есть ли способ разбить seq на куски и создать новое задание для каждого чанка, чтобы он оценивался параллельно?
Я также хотел бы посмотреть, есть ли подобная реализация pmap
для списка,Я обнаружил, что Томас имеет ParallelList
реализацию в своем блоге здесь .Но я не уверен, что преобразование списка в массив для выполнения параллельной оценки не повлечет за собой слишком много накладных расходов и можно ли этого избежать?
РЕДАКТИРОВАТЬ: Спасибо за все ваши входные данные.Томас ответил на мой первоначальный вопрос.
Отвечая на мой собственный вопрос в первом редактировании:
Я попытался разбить большой список на куски, а затем применить асинхронность к каждому подсписку.
let pmapchunk f xs =
let chunks = chunk chunksize xs
seq { for chunk in chunks -> async { return (Seq.map f) chunk } }
|> Async.Parallel
|> Async.RunSynchronously
|> Seq.concat
Результаты: map
: 15 с, pmap
: 7 с, pmapchunk
: 10 с.