Julia中大数据的并行计算

时间:2015-07-28 02:08:53

标签: parallel-processing julia

首先我的问题:

  • 是否有可能阻止Julia每次在并行for循环中复制变量?
  • 如果没有,如何在Julia中实现并行减少操作?

现在详情:

我有这个程序:

data = DataFrames.readtable("...") # a big baby (~100MB)
filter_functions = [ fct1, fct2, fct3 ... ] # (x::DataFrame) -> y::DataFrame
filtered_data = @parallel vcat for fct in filter_functions
  fct(data)::DataFrame
end

它的功能很好,但是对另一个worker的fct(data)的每次并行调用都会复制整个数据帧,使得一切都变得非常缓慢。

理想情况下,我想加载一次数据,并始终在每个工作者上使用预加载的数据。 我想出了这样的代码:

@everywhere data = DataFrames.readtable("...") # a big baby (~100MB)
@everywhere filter_functions = [ fct1, fct2, fct3 ... ] # (x::DataFrame) -> y::DataFrame
@everywhere for i in 1:length(filter_functions)
  if (myid()-1) % nworkers()
    fct = filter_functions[i]
    filtered_data_temp = fct(data)
  end
  # How to vcat all the filtered_data_temp ?
end

但是现在我还有另外一个问题:我无法弄清楚如何将vd()所有filtered_data_temp放到worker中的变量上,并使用myid()== 1。

我非常感谢任何见解。

注意:我知道Operating in parallel on a large constant datastructure in Julia。但是,我不相信它适用于我的问题,因为我的所有filter_functions都在整个数组上运行。

2 个答案:

答案 0 :(得分:10)

您可能希望查看/加载您的数据到Distributed Arrays

编辑:可能是这样的:

data = DataFrames.readtable("...")
dfiltered_data = distribute(data) #distributes data among processes automagically
filter_functions = [ fct1, fct2, fct3 ... ] 
for fct in filter_functions
  dfiltered_data = fct(dfiltered_data)::DataFrame
end

您还可以查看unit tests了解更多示例

答案 1 :(得分:4)

毕竟,我在那里找到了我的问题的解决方案:Julia: How to copy data to another processor in Julia

特别是,它引入了以下原语,以便从另一个进程中检索变量:

getfrom(p::Int, nm::Symbol; mod=Main) = fetch(@spawnat(p, getfield(mod, nm)))

以下是我使用它的方式:

@everywhere data = DataFrames.readtable("...") # a big baby (~100MB)
@everywhere filter_functions = [ fct1, fct2, fct3 ... ] # (x::DataFrame) -> y::DataFrame
# Executes the filter functions
@everywhere for i in 1:length(filter_functions)
  local_results = ... # some type
  if (myid()-1) % nworkers()
    fct = filter_functions[i]
    filtered_data_temp = fct(data)
    local_results = vcat(local_results, filtered_data_temp)
  end
  # How to vcat all the filtered_data_temp ?
end
# Concatenate all the local results
all_results = ... # some type
for wid in 1:workers()
  worker_local_results = getfrom(wid, :local_results)
  all_results = vcat(all_results,worker_local_results)
end