2012-04-05 13 views
5

Estoy imprimiendo una gran serie de figuras como archivos .png. Cada figura es un gráfico de una columna de una matriz de datos, y tomo los archivos .png y los ato juntos en una animación.¿Por qué MATLAB se ralentiza cuando se imprimen muchas figuras (.png)?

Mi problema es que los primeros cientos de imágenes se imprimen rápidamente, pero la cantidad de tiempo para crear cada nueva figura aumenta rápidamente, de ~ 0.2 segundos para los primeros cientos de archivos .png a 2 segundos o más en torno al 800º figura.

El uso de la memoria aumenta durante la ejecución de la secuencia de comandos, pero solo en 1 MB cada pocos segundos más o menos. Esto está en Windows ejecutando R2009b de 64 bits.

Mi código es algo como:

n = 1000; 
matrix = rand(n); 

f = figure('Visible','off'); % create the figure 

for i_ =1:n 
    plot(1:n,matrix(:,i_)); 
    ylim([0 1]); 
    set(f,'PaperUnits','inches','PaperPosition',[0 0 6 4]); 
    png_name = [ 'img/timestep_' sprintf('%05d',i_) ]; 
    print('-dpng', png_name); 
end 
+0

¿Puedes hacer solo 500 a la vez? ¿Tienes un servicio que reiniciará tu aplicación? –

+3

No puedo enfatizar esto lo suficiente ... MATLAB tiene un maravilloso generador de perfiles integrado y debe usarlo regularmente. La creación de perfiles ayuda a identificar muchos de estos problemas. – linuxuser27

Respuesta

4

Trate de no regenerar la trama, pero sólo cambiar las propiedades XData y YData en cada iteración:

set(f,'PaperUnits','inches','PaperPosition',[0 0 6 4]); 
h = plot(1, matrix(:,1)); 
ylim([0 1]); 

for i_ = 1:n 
    set(h, 'XData', 1:n, 'YData', matrix(:,i_)) 
    png_name = sprintf('img/timestep_%05d',i_); 
    print('-dpng', png_name); 
end 

Otra sugerencia. Si quieres crear una animación, ¿por qué estás generando archivos png? Use GETFRAME y haga un MOVIE directamente en MATLAB.

2

Esto parece una pérdida de memoria. Es posible que pueda ayudar a Matlab a liberar la memoria filtrada creando y closing cada figura en el ciclo.

for i = 1:n 
    f = figure; 
    % plot 
    % print 
    close(f) 
end 

Actualización:Here's a question and answer decir que esta técnica funciona.

+0

No lo intenté, pero si cerrar una imagen y hacer una nueva toma algo de tiempo, considere hacerlo solo cada 100 imágenes más o menos. –

Cuestiones relacionadas