Hi There,
I just want to confirm this is a desired behavior of map/pmap functions.
What I am noticing is that in case of using pmap functions need to return data
(copy of input data), whereas map works fine with referenced values. I'd love
to have similiare behaviuor in pmap since it is much lightweight especially
when dealing with large datasets, but the more I think about it, the more it
makes sense to me that this is not going to happen due to the type of
parallelism Julia supports at teh moment (massage passing).
Could please someone more competent verify if the code attached below is
correct? What I was hoping for is to have a pmap working with the functions
where data is passed around as a reference (no return statmentts).
Unfortunately this is only true when using single threaded map() function.
I was wondering are there any alternatives at the moment? I know there is a
Shareded array options but so far I did't have a chance to fully comprehended
it. As far as I understand Distributed arrays will give me similar bottlneck as
pmap where data has to be copied back into original container...?
Thanks, any feedback is much appreciated.
kuba
##################################################
addprocs(2)
@everywhere function testRef(elem)
id = elem[1]
d = elem[2]
d[id]="___$id"
end
@everywhere function testCopy(elem)
id = elem[1]
d = elem[2]
d[id]="___$id"
return elem
end
ids = [[i,Dict()] for i=(1:3)]
pmap(testRef, ids) # pmap - Dictionary is empty
print("=== pmap ref:", ids)
map(testRef, ids) # map - works as expected
print("=== map ref:", ids)
ids_copy = pmap(testCopy, ids) # works - but creates a copy - slow
print("=== pmap copy:", ids_copy)
##################################################
Output:
=== pmap ref:1
Dict{Any,Any}()
2 Dict{Any,Any}()
3 Dict{Any,Any}()
=== map ref:1
{1=>"___1"}
2 {2=>"___2"}
3 {3=>"___3"}
=== pmap copy:1
{1=>"___1"}
2 {2=>"___2"}
3 {3=>"___3"}