Julia pmap — запись в массив

#arrays #julia #pmap

Вопрос:

Не могли бы вы, пожалуйста, указать мне на код, использующий pmap, который перебирает столбцы массива, записывая в него сложные структуры, которые не являются объектами битового типа? Я понимаю, что SharedArray имеет ограничение, требующее элементов битового типа.

Спасибо,

Комментарии:

1. Я думаю, что ваши два вопроса следует объединить в один, касающийся того, как обмениваться объектами не битового типа между рабочими процессами.

Ответ №1:

A SharedArray -это просто блок памяти, разделяемый всеми процессами, запущенными на одном и том же локальном узле в кластере Julia. Поскольку вы используете общую память, вам необходимо знать размер ее блока и, следовательно, требования к типу бита.

Я могу придумать два варианта:

  • используйте библиотеку, предназначенную для отправки объектов между работниками в кластере Julia — ParallelDataTransfer.jl эта работа выполняется довольно хорошо
  • попробуйте сериализовать общий объект в память, используя значение на SharedArray основе байтов. В этом случае вам, к сожалению, потребуется самостоятельно управлять компоновкой памяти объекта.

Для второго примера код может выглядеть примерно так:

 using Distributed
addprocs(2)
@everywhere using Serialization, SharedArrays
s = SharedVector{UInt8}(1_000_0000);
@everywhere struct Dat           
       a::Int                           
       b::String                        
end                                      
d = Dat(3,"hello")               
 

Теперь этот объект можно записать в общую память:

 io = IOBuffer(s,write=true)
serialize(io, d)
 

И его могут прочитать удаленные работники:

 julia> @sync @distributed for i in 1:2
           io = IOBuffer(s)
           dat2 = deserialize(io)
           println(myid, dat2)
       end
      From worker 2:    myidDat(3, "hello")
      From worker 3:    myidDat(3, "hello")
Task (done) @0x0000000078079140