当“清除”不起作用时,如何强行释放物理内存?

时间:2017-03-15 08:06:58

标签: matlab memory memory-management memory-leaks clear

与提议的副本的区别:

首先,我想说我不是在谈论释放用于变量的物理内存,因此在这种情况下命令clearclosepack没有工作。在我的情况下,尽管在运行我的MATLAB脚本(不要太长时间)几次后使用它们,我的计算机的物理内存仍然耗尽。

我在具有8Gb RAM的Windows计算机中使用MATLAB R2016b。正如我之前所说,经过几次,我的计算机的物理内存开始耗尽,因此继续运行代码的唯一方法是重新启动程序(当我想运行脚本时,我不能这样做)。

clear all
clc
close all
%Datos entrada:
Long=60;                                  %Longitud viga (m)
p_uni=1;                                   %Carga repartida uniforme(kN/m)
n_division = 1000;                           %Numero divisiones de la viga
H = 3;                                    %Componente horizontal en extremos
lon_barra=Long/n_division;
a = Long;
P_y = p_uni*lon_barra;

% Inicio programa:

if rem(n_division-1,2)==0   %Para el caso de numero par de fuerzas, que hace que el foco fin-comienzo de la representacion de fuerzas
    y_force(1:((n_division-1)/2))=(((n_division-1)/2):-1:1)*P_y;
    y_force(((n_division-1)/2)+1:n_division-1)=(1:1:(n_division-1)/2)*P_y;
else                        %Para el caso de numero impar de fuerzas,
    y_force(n_division)=P_y/2;
    y_force(1:n_division/2)=((n_division/2-0.5):-1:0.5)*P_y;
    y_force(n_division/2+1:n_division)=(0.5:1:n_division/2)*P_y;
end
%Numero par de fuerzas sobre nodos internos
if rem(n_division-1,2)==0       
    N = ones(1,n_division-1);
    alfa = ones(1,n_division-1);
    for i=1:n_division-1
        alfa(i) = atan(y_force(i)/H);
        N(i) = y_force(i)/sin(alfa(i));
    end
    alfa_fin = zeros(1,n_division);
    alfa_fin(1:length(alfa)/2)=alfa(1:length(alfa)/2);
    alfa_fin(length(alfa)/2+2:end)=alfa(length(alfa)/2+1:end);

    N_fin = ones(1,n_division);  
    N_fin(1:length(N)/2)=N(1:length(N)/2);
    N_fin(length(N)/2+2:end)=N(length(N)/2+1:end);
    N_fin(length(N)/2+1) = H;

    for i=1:n_division+1
        if i<=((n_division+1)/2)
            if i==1;
                y(i) = 0;
            else
                y(i) = tan(alfa_fin(i-1))*lon_barra+y(i-1);
            end
        else
            y(i)=y(i-1)-tan(alfa_fin(i-1))*lon_barra;
        end
    end  
%Numero impar de fuerzas sobre nodos internos
else                   
    N = ones(1,n_division);
    alfa = ones(1,n_division);
    for i=1:n_division
        alfa(i) = atan(y_force(i)/H);
        N(i) = y_force(i)/sin(alfa(i));
    end
    y = ones(1,n_division+1);
    for i=1:n_division+1
        if i<=((n_division/2)+1)
            if i==1;
                y(i) = 0;
            else
                y(i) = tan(alfa(i-1))*lon_barra+y(i-1);
            end
        else
            y(i)=y(i-1)-tan(alfa(i-1))*lon_barra;
        end
    end
end
%Densidad para altura objetivo:
q_final=H/lon_barra;

此图显示每次运行代码后所需的内存增加:

enter image description here

1 个答案:

答案 0 :(得分:0)

我怀疑你会得到比这个主题MATLAB documentation中出现的更好的提示。我想指出的一个具体问题是:

  

长期使用(仅限Windows系统)

     

在32位Microsoft®Windows®上,由于Windows内存管理器不会向操作系统返回某些类型和大小的块,因此MATLAB的工作空间会随着时间的推移而碎片化。清除MATLAB工作区不能解决此问题。您可以通过先分配最大的变量来最小化问题。然而,这并不能解决工作区的最终碎片,例如,在数天和数周内连续使用MATLAB。唯一的解决方案是保存您的工作并重新启动MATLAB。

     

将所有变量保存到磁盘并将其加载回来的pack命令对这种情况没有帮助。

我知道它说“32位”,但我敢打赌这在某种程度上也适用于64位系统。

底线 - 您需要遵循文档的指导原则,特别注意预分配(在循环中增长y)。

您可以做的另一件事是配置内存使用情况以查找内存泄漏。

在R2016b上可以使用的另一个选项是使用tall arrays - 它们没有保存在RAM中。