#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