Рассмотрим prova.mat
в MATLAB, полученном следующим образом:
for w=1:100
for p=1:9
A{p}=randn(100,1);
end
baseA_.A=A;
eval(['baseA.A' num2str(w) '= baseA_;'])
end
save(sprintf('prova.mat'),'-v7.3', 'baseA')
Чтобы иметь представление о фактических размерах в моих данных, 1x9 cell
в A1
состоит из следующих массивов 9
: 904x5, 913x5, 1722x5, 4136x5, 9180x5, 3174x5, 5970x5, 4455x5, 340068x5
. Другие Aj
имеют сходный состав.
Рассмотрим следующий код
clear all
load prova
tic
parfor w=1:100
indA=sprintf('A%d', w);
Aarr=baseA.(indA).A;
Boot=[];
for p=1:9
C=randn(100,1).*Aarr{p};
Boot=[Boot; C];
end
D{w}=Boot;
end
toc
Если я запустил цикл parfor
с местными работниками 4
в моем Macbook Pro, он занимает 1,2 секунды. Заменяя parfor
на for
, требуется 0,01 сек.
С моими фактическими данными разница времени составляет 31 сек против 7 сек [создание матрицы C
также более сложное].
Если вы правильно поняли, проблема в том, что компьютер должен отправлять baseA
каждому локальному рабочему, и для этого требуется время и память.
Не могли бы вы предложить решение, способное сделать parfor
более удобным, чем for
? Я думал, что сохранение всех ячеек в baseA
было способом сэкономить время, загрузив один раз в начале, но, возможно, я ошибаюсь.