Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Map F中的并行数据收集#_Map_F#_Parallel Processing - Fatal编程技术网

Map F中的并行数据收集#

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 是

列表、数组或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
是否为序列中的每个元素生成一个新线程?如果是这样的话,有没有办法将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
    )执行计算的函数,以及可用于实现过滤的
    选择
    函数
如果您正在编写一个相当简单的复杂的操作管道,但其中有大量操作,则需要使用PLINQ,它可以并行化整个管道,而不是仅并行化单个操作(如map)


  • 查看中的
    PSeq
    模块以获得一个F#友好的包装器-它定义了
    PSeq以及Tomas关于查看
    Array.Parallel的建议。值得注意的是,数组(和数组支持的集合)始终是最有效的遍历(map、iter等等)因为它们存储在连续内存中。

    谢谢。我确实在你的博客上遇到了
    Array.Parallel
    PSeq
    ,还有
    parallellelist
    。最后两个似乎没有包含在库参考中,只有
    Array.Parallel
    包含。我已经编辑了这个问题,请看一看。“如果单个操作需要很长时间,那么使用数组可能是最有效的”?当单个操作很快时,我希望数组会相对较快。
    list
    是并行编程中最糟糕的集合类型,因为它的顺序令人尴尬。这取决于具体情况,但您几乎肯定希望
    Array.parallel
    而不是
    async