下面的方法使用減少@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
heavy
現在將舉行:
Dict{Any,Any} with 3 entries:
2 => 1000
3 => 1000
1 => 1000
的想法是產生一個不同的字典每個工人,填充它並最終將字典合併爲一個。希望結合字典的執行速度足以讓這個值得 - 這似乎是合理的。
爲了實現這個想法,我們定義了rdc
並使用多次調度使它有三個目的:1)在每個工人上初始化一個新的Dict。 2)將新項目推送到工作人員現有的Dict上。 3)在@parallel
的最後階段結合來自不同工作人員的字典。上面代碼中的三種方法(按其各自的順序)執行此操作。
避免了對SharedDict或SharedArray的需求,因爲工作人員在不同的對象上工作,並且在@parallel
實現中隱藏了最終的內部工作者通信。
你是什麼意思,它沒有工作?使用第一個插槽中的1,2和3列表,我得到了一個字典映射1,2和3到10000000. –
我得到一個空的字典。 Heavy:Dict {Any,Any}() –
你是對的,我在運行Julia時沒有任何工作進程。我現在看到了同樣的事情。 –