Самый простой совет: не используйте global
по множеству причин, уже описанных / связанных здесь.В идеале вы должны реструктурировать свой код следующим образом:
Var = createData(); % returns 'Var' rather than creating a global 'Var'
parfor idx = ...
% simply use 'Var' inside the parfor loop.
out(idx) = processData(Var, ...);
end
Обратите внимание, что parfor
достаточно умен, чтобы отправлять Var
каждому работнику ровно один раз для вышеуказанного цикла.Тем не менее, он недостаточно умен, чтобы не отправлять его несколько раз, если у вас несколько циклов parfor
.В этом случае я бы предложил использовать parallel.pool.Constant
.Как вы используете, зависит от стоимости создания Var
по сравнению с его размером.Если он небольшой, но дорогой в создании - это означает, что вам лучше всего создать его только один раз на клиенте и отправить его рабочим, например:
cVar = parallel.pool.Constant(Var);
Если он большой, но относительнобыстро построить, вы могли бы подумать о том, чтобы каждый из работников создал свою собственную копию независимо, как это:
cVar = parallel.pool.Constant(@createData); % invokes 'createData' on each worker