Map F中的并行数据收集#
列表、数组或seq中的哪一个对于并行处理更有效,并且可以轻松实现并行操作,例如Map F中的并行数据收集#,map,f#,parallel-processing,Map,F#,Parallel Processing,列表、数组或seq中的哪一个对于并行处理更有效,并且可以轻松实现并行操作,例如parmap、parfilter等 编辑: 谢谢你的建议Array.Parallel看起来是个不错的选择。还查看了PSeq.fs,我有一个关于下面的pmap如何工作的问题 let pmap f xs = seq { for x in xs -> async { return f xs } } |> Async.Parallel |> Async.RunSynchronously 是
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
实现。我发现Tomas在他的博客文章中有一个并行列表
实现。但我不确定将列表转换为数组以执行并行计算是否不会产生太多开销,是否可以避免
编辑:
谢谢你的投入。托马斯回答了我最初的问题
在第一次编辑中回答我自己的问题:
我试着将一个大列表分解成块,然后对每个子列表应用异步
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
:15s,pmap
:7s,pmapchunk
:10s。实际上,与异步操作的成本相比,切换收集类型的开销很小,所以收集类型无关紧要
话虽如此,
List
确实倾向于与F#语法更好地结合,因此它可能是最好的在F#库中有一些数组操作的并行实现。通常,如果单个操作需要很长时间,那么使用阵列可能是最有效的
- 查看
模块。它包含用于创建数组(Array.Parallel
)的函数,用于使用元素(init
)执行计算的函数,以及可用于实现过滤的map
函数选择
- 查看中的
模块以获得一个F#友好的包装器-它定义了PSeq
PSeq以及Tomas关于查看
Array.Parallel的建议。值得注意的是,数组(和数组支持的集合)始终是最有效的遍历(map、iter等等)因为它们存储在连续内存中。谢谢。我确实在你的博客上遇到了
,Array.Parallel
,还有PSeq
。最后两个似乎没有包含在库参考中,只有parallellelist
包含。我已经编辑了这个问题,请看一看。“如果单个操作需要很长时间,那么使用数组可能是最有效的”?当单个操作很快时,我希望数组会相对较快。Array.Parallel
是并行编程中最糟糕的集合类型,因为它的顺序令人尴尬。这取决于具体情况,但您几乎肯定希望list
而不是Array.parallel
。async