¿Ahorrando tiempo y memoria usando parfor?
Considerarprova.mat
en MATLAB obtenido de la siguiente manera
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')
Para tener una idea de las dimensiones reales en mis datos, el1x9 cell
enA1
está compuesto por lo siguiente9
matrices:904x5, 913x5, 1722x5, 4136x5, 9180x5, 3174x5, 5970x5, 4455x5, 340068x5
. El otroAj
's tienen una composición similar.
Considere el siguiente código
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
Si corro elparfor
bucle con4
Los trabajadores locales en mi Macbook Pro tardan 1,2 segundos. Sustituciónparfor
confor
toma 0.01 seg.
Con mis datos reales, la diferencia de tiempo es 31 segundos versus 7 segundos [la creación de la matrizC
también es más complicado].
Si lo he entendido correctamente, el problema es que la computadora tiene que enviarbaseA
a cada trabajador local y esto requiere tiempo y memoria.
¿Podría sugerir una solución que sea capaz de hacerparfor
más conveniente quefor
? Pensé que guardar todas las celdas enbaseA
era una forma de ahorrar tiempo cargando una vez al principio, pero tal vez me equivoque.