本文最后更新于 2023年9月22日。
在 Windows® 系统上,memory
函数可用于检查内存详细信息。要了解复制数组如何影响 Windows 系统的内存使用量,请在当前文件夹的一个文件中创建函数 memUsed
。该函数调用 memory
,以 MB 为单位返回您的 MATLAB 进程使用的内存量。
function y = memUsed
usr = memory;
y = usr.MemUsedMATLAB/1e6;
调用 `memUsed` 以显示当前内存使用量。
format shortG
memUsed
ans =
3966.1
创建一个 2000×2000 数值数组,并观察内存使用量的变化。该数组使用大约 32 MB 的内存。
A = magic(2000);
memUsed
ans =
3998.1
避免临时性的数据副本
避免创建不必要的临时性数据副本,以显著减少所需的内存量。
避免创建临时数组
避免创建大型临时变量,并在不再需要这些临时变量时清除它们。例如,以下代码创建由零组成的、存储为临时变量 A
的数组,然后将 A
转换为单精度:
A = zeros(1e6,1);
As = single(A);
使用一个命令来执行两个操作可更高效地使用内存:
A = zeros(1e6,1,'single');
使用 repmat
函数、数组预分配和 for
循环是处理非双精度数据而不需要内存中的临时存储的其他方法。
使用嵌套函数减少传递的参数
处理大型数据集时,注意 MATLAB 会创建输入变量的临时副本(如果被调用函数修改其值)。这会暂时使存储数组所需的内存翻倍,从而导致 MATLAB 在没有足够内存时生成错误。
在此情形下使用较少的内存的一种方法是使用嵌套函数。嵌套函数共享所有外部函数的工作区,为嵌套函数提供对其通常范围之外的数据的访问权。在如下示例中,嵌套函数 setrowval
可直接访问外部函数 myfun
的工作区,从而无需在函数调用中传递变量副本。当 setrowval
修改 A
的值时,它在调用函数的工作区中修改它。无需使用额外内存为所调用函数存储一个单独数组,且无需返回 A
的修改后的值:
function myfun
A = magic(500);
setrowval(400,0)
disp('The new value of A(399:401,1:10) is')
A(399:401,1:10)
function setrowval(row,value)
A(row,:) = value;
end
end
回收使用的内存
增加可用内存量的一种简单方法是清除您不再使用的大型数组。
定期将您的大型数据保存到磁盘
如果您的程序生成非常大量的数据,请考虑定期将数据写入磁盘。在保存该部分数据后,使用 clear
函数从内存中删除变量并继续生成数据。
从内存中清除不再需要的旧变量
当您重复或以交互方式处理非常大的数据集时,请首先清除旧变量以为新变量腾出空间。否则,MATLAB 需要等大小的临时存储才能覆盖此变量。例如,
a = rand(1e5);
b = rand(1e5);
Out of memory.
More information
clear a
a = rand(1e5); % New array