【问题标题】:Collecting results of @parallel for-loop via remotecall通过远程调用收集@parallel for-loop 的结果
【发布时间】:2017-11-30 05:29:42
【问题描述】:

我使用@parallel for 宏来运行一系列参数的模拟。每次运行都会产生一个一维向量。最后我想将结果收集到DataFrame

到目前为止,我一直创建一个中间数组并使用 vcat 减少 for 循环;然后构造了DataFrame。我认为它也可以通过push! 将每次计算的结果通过remotecall 传递给主进程。一个最小的例子看起来像

X=Float64[]

@sync @parallel for i in linspace(1.,10.,10)
        remotecall_fetch(()->push!(X,i),1)
       end

其结果始终是一个数组X,其中包含 9 个而不是 10 个元素。随着更多工人的加入,丢弃的元素数量会越来越多。

这是在 julia-0.6.1 上。

我以为我了解了 Julia 的并行计算结构,但似乎没有。

这种行为的原因是什么?我怎样才能做得更好、更安全?

【问题讨论】:

    标签: parallel-processing julia


    【解决方案1】:

    我怀疑你正在触发竞争条件,但不能说是在哪里。

    如果每次迭代只需要返回一个值,我建议只使用pmap

    pmap(linspace(1.,10.,10)) do i
        i
    end
    

    否则,如果每次迭代都可能返回多个值,最好使用RemoteChannels

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2014-03-02
      • 2013-01-27
      相关资源
      最近更新 更多