我有大量的向量字符串向量: 大約有50000個字符串向量, 其中每個向量包含2-15個長度爲1-20個字符的字符串。在Julia的大型常量數據結構上並行操作
MyScoringOperation
是一個函數,它對一個字符串向量(數據)進行操作並返回一個10100分數的數組(作爲Float64s)。這需要大約0.01秒的運行MyScoringOperation
(取決於數據的長度)
function MyScoringOperation(state:State, datum::Vector{String})
...
score::Vector{Float64} #Size of score = 10000
我有一個相當於一個嵌套循環。 外環通常的做法會運行500次迭代
data::Vector{Vector{String}} = loaddata()
for ii in 1:500
score_total = zeros(10100)
for datum in data
score_total+=MyScoringOperation(datum)
end
end
在一臺計算機上的3000(而不是50,000)小的情況下,測試這需要每外環100-300秒。
我有3個安裝了Julia 3.9的強大服務器(並且可以更輕鬆地獲得3個,然後在下一個規模可以獲得數百個)。
我有@parallel基本經驗,但現在看來似乎是花費了大量的時間拷貝常數(它或多或少地掛在較小的測試用例)
這看起來像:
data::Vector{Vector{String}} = loaddata()
state = init_state()
for ii in 1:500
score_total = @parallel(+) for datum in data
MyScoringOperation(state, datum)
end
state = update(state, score_total)
end
我的這個實現使用@parallel的方式理解是,它:
對於每個ii
:
- 分區
data
到每個工人 - 吸盤發送一個吸盤把每個工人
- 所有工作過程中有豆腐塊
- 主要過程總結的結果,因爲他們到達。
我想刪除第2步, 讓而不是發送數據塊到每個工人的, 我只是發了一系列指標的每個工作人員,他們看它自己的拷貝了data
。甚至更好,只給每個只有自己的塊,並讓他們每次重複使用(節省大量的RAM)。
分析支持我對@parellel功能的信念。 對於類似的範圍問題(數據更小), 非並行版本在0.09秒運行, 和 並行運行並且分析器顯示幾乎所有時間都用了185秒。分析器顯示幾乎100%是花費與網絡IO交互。
我懷疑這是密切相關的http://stackoverflow.com/questions/26067574/how-to-run-a-method-in-parallel-using-julia –