本节介绍帮助你更节约地使用内存,并避免“Out of Memory”错误出现的方法。
1.使用变量
为了在创建变量时节约内存,注意:
避免创建大型临时性变量,不再需要时清除它们;
避免使用全局变量。
使用固定大小的数组时,尽量进行预分配;
将变量设置为空矩阵[ ],将它从内存中清除,或用clear函数清除变量;
尽量重用变量。
2.把数据压入内存
因为MATLAB用堆管理内存,所以运行时会产生内存碎片。内存成为碎片时,会有很多闲置的空间。当闲置空间太多时,就没有足够的内存保存新的大型变量,并导致“Out of memory”错误产生。此时,可以用pack函数把数据压入内存,从而把更多相邻的内存块“释放”出来。
注意:从运行时间上考虑,不要在循环或M文件函数中使用pack函数。
3.从内存中清除不再使用的变量
如果使用pack函数以后,内存仍然不够,可能需要从内存中删除一些不再使用的变量。
4.有大量数据的情况
如果程序生成大量数据,建议周期性地把数据写入磁盘。保存一部分数据以后,从内存中清除变量并继续生成数据。
5.把满秩矩阵转换为稀疏矩阵
大部分元素为0的矩阵最好保存为稀疏矩阵。稀疏矩阵使用的内存更少,并且比满秩矩阵运行更快,可用sparse函数进行转换。
比较两个1000×1000的矩阵X和Y。其中,X为double型,其中2/3的元素等于0;Y为X的稀疏矩阵形式,如下所示。Y所占用的内存大约只有X的一半。
code.matlab
whos
Name Size Bytes Class
X 1000x1000 8000000 double array
Y 1000x1000 4004000 double array(sparse)
6.单元数组的内存需求
整个的单元数组或结构数组,并不需要连续的内存。因为它们实际上是一个指向其他数组的指针数组,要求每个数组的内存是连续的,但整个内存集合则不要求。
7.比较数组结构和结构数组
如果MATLAB应用程序需要保存一大套数据,并且数据可以保存为数组结构或结构数组,则前者更好。对于同一套数据,数组结构需要的内存比结构数组的少得多,并且处理起来速度也更快。
8.嵌套函数调用
嵌套函数使用的内存与连续行方式调用它们时所占用的相同。如下面两个例子需要相同大小的内存。
code.matlab
result = function2(function1(input99));
result = function1(input99);
result = function2(result);