Iva*_*uez 3 parallel-processing dictionary julia
我正在尝试并行实现以下 for 循环来初始化字典。
heavy=Dict()
for item in list
heavy[item[1]]=10000000
end
Run Code Online (Sandbox Code Playgroud)
其中list
是列表的列表,每个项目都有三个元素。
我正在尝试这样的事情:
heavy=Dict()
@parallel for item in list
heavy[item[1]]=10000000
end
Run Code Online (Sandbox Code Playgroud)
然而它没有起作用。阅读文档后,我发现一个名为 SharedArrays 的东西可以解决这个问题。然而,目前尚不清楚如何使用其他数据结构(如 Dict() 或 Set())来做同样的事情。先感谢您。
以下方法使用归约@parallel
来实现相同的结果:
list = [[rand(1:3),4,5] for i=1:10000000]; # define random test `list`
@everywhere rdc(d::Vector,i::Vector) = rdc(rdc(Dict(),d),i)
@everywhere rdc(d::Dict,i::Vector) = begin d[i[1]] = 1000; d end
@everywhere rdc(d::Dict,i::Dict) = merge!(d,i)
heavy = @parallel (rdc) for item in list
item
end
Run Code Online (Sandbox Code Playgroud)
heavy
现在将举行:
Dict{Any,Any} with 3 entries:
2 => 1000
3 => 1000
1 => 1000
Run Code Online (Sandbox Code Playgroud)
这个想法是为每个工作人员生成一本不同的字典,填充它,最后将这些字典合并为一个。希望组合字典的实现速度足够快,使这一切变得有价值——这似乎是合理的。
为了实现这个想法,我们定义rdc
并使用多重调度来使其服务于三个目的:1)在每个工作人员上初始化一个新的 Dict。2) 将新项目推送到工作人员上的现有字典中。3)在最后阶段合并来自不同worker的Dict @parallel
。rdc
上面代码中的三个方法(按各自的顺序)实现了这一点。
避免了对 SharedDict 或 SharedArray 的需要,因为工作人员在不同的对象上工作,并且最终的工作人员间通信隐藏在实现中@parallel
。
归档时间: |
|
查看次数: |
1143 次 |
最近记录: |