F#中的并行数据收集

vis*_*vis 8 parallel-processing f# map

哪个列表,阵列或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
Run Code Online (Sandbox Code Playgroud)

是否为序列中的每个元素生成了一个新线程?如果是这样,是否有办法将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
Run Code Online (Sandbox Code Playgroud)

结果:: map15s,pmap:7s,pmapchunk:10s.

Tom*_*cek 9

在F#库中有一些并行实现的数组操作.通常,如果单个操作需要很长时间,那么使用数组可能会最有效.

  • 看看Array.Parallel模块.它包含用于创建array(init)的函数,用于使用elements(map)执行计算以及choose可用于实现过滤的函数.

如果您正在编写一个非常简单的复杂操作流程,但是有大量的操作,您需要使用PLINQ,它将整个管道并行化,而不是仅仅并行化单个操作(如map) .

  • PSeqF#PowerPack看一下F#友好包装器的模块- 它定义了pseq<'T>类型和使用它们的常用功能.此博客文章还包含一些有用的信息.

  • “如果单个操作要花很长时间,则使用数组可能会最高效”?我希望当单个操作很快时,数组会相对更快。 (2认同)