【问题标题】:Parallelize row-operation in Julia在 Julia 中并行化行操作
【发布时间】:2014-12-11 16:09:37
【问题描述】:

来自 R 背景,我正在探索 Julia 的并行可能性。我的目标是复制 mcapply 的性能(并行应用)

** 问题:**

我在看起来像这样的数据框的行上迭代一个函数:

for i in 1:_nrow # of my DataFrame
lat1 = Raw_Data[i,"lat1"]
lat2 = Raw_Data[i,"lat2"]
lon1 = Raw_Data[i,"long1"]
lon2 = Raw_Data[i,"long2"]
iata1 = Raw_Data[i,"iata1"]
iata2 = Raw_Data[i,"iata2"]

a[i] = [(iata1::String,iata2::String, trunc(i,2), get_intermediary_points(lat1,lon1,lat2,lon2,j) )  for j in 0:.1:1]
end

现在,作为迈向并行化的一步,我还可以创建一个匿名函数,该函数执行非常相似的工作,对我的数据帧的每个块运行计算:

Raw_Data["selector"] = rand(1:nproc,_nrow) # Define how I split my dataframe. 1 chunck per proc
B = by(Raw_Data,:selector,intermediary_points)

有没有办法通过并行化的“by”来加快计算速度?否则,请提出好的替代方案。

谢谢!

注意:这就是我的数据框 Raw_Data 的样子

6x7 DataFrame:
          iata1     lat1     long1 iata2     lat2       long2
[1,]    1 "ELH" 0.444616   -1.3384 "FLL" 0.455079    -1.39891
[2,]    2 "BCN" 0.720765 0.0362729 "UFA" 0.955274    0.976218
[3,]    3 "ACE" 0.505053 -0.237426 "VCE" 0.794214    0.215582
[4,]    4 "PVG" 0.543669   2.12552 "LZH" 0.425277     1.91171
[5,]    5 "CDG" 0.855379 0.0444809 "VLC" 0.689233 -0.00835298
[6,]    6 "HLD" 0.858699   2.08915 "CGQ" 0.765906     2.18718

【问题讨论】:

  • 您是否考虑过编写修改后的get_intermediary_points,比如get_intermediary_points_pmap,然后使用a = pmap(get_intermediary_points_pmap, eachrow(Raw_Data)

标签: parallel-processing julia


【解决方案1】:

我知道发生了什么。我没有将所有输入都提供给所有处理器。

基本上,如果您遇到同样的问题:

  1. 所有函数前面都应该有@everywhere

  2. 还应使用 DataFrames 将所有包声明为 @everywhere

  3. 所有参数也应该在前面加上@everywhere 其中

现在,工作量很大。您可以关注http://julia.readthedocs.org/en/latest/manual/parallel-computing/ 使用可以简化流程的独立包。

干杯。

【讨论】:

  • 如果你有一个文件包含一堆所有进程都应该知道的函数,你可以简单地使用@everywhere include("/path/to/myfun.jl")。这样你就不必修改函数内部的声明文件。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 2021-07-17
相关资源
最近更新 更多