在使用大矩阵的时候,会遇到out of memory的问题,这个让人很纠结,解决的方法一个是从电脑方面,一个就是自身的程序优化问题。从网站各种资料和官方的help中总结了一些。
首先要知道matlab是如何存储矩阵的,Matlab中矩阵是以Block,也就是块的形式存储的。也就是说,当Matlab在为即将存储的矩阵划分块时,如果没有相应大小的连续内存,即使实际内存没有被完全使用,他还是会报告“Out of Memory”。
下面就是一些方案让我们高效的去使用内存。
1、为矩阵变量预制内存而不是动态分配,意思就是你在用数据的使用,有个初始化,例如有个矩阵a,在开始就分配a = zeros(1, 1000);
2、尽量早的分配大的矩阵变量,意思就是哪个矩阵大,你先分配哪个,c = rand(2.1e6,1);cleara = rand(1e6,1);b = rand(1e6,1);要比a = rand(1e6,1);b = rand(1e6,1);clearc = rand(2.1e6,1);节约很多
3、尽量的重复使用变量(跟不用的clear掉一个意思)
4、将矩阵转化成稀疏形式,如果矩阵中有大量的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。
5.使用pack命令,最好让matlab程序分段运行,在每一段运行前,在matlab命令行中敲入"pack"。
当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。
6.如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。
7.增大内存,这里是物理内存
8、增大内存,这里是虚拟内存,右键“我的电脑”->属性->高级->性能->设置,从而改变其虚拟内存。
9、尽量少时用系统资源(对于Windows),Windows中字体、窗口等都是要占用系统资源的,所以在Matlab运行时尽量不要打开不用的窗口。
10、打开3G开关,右键点击我的电脑 -> 属性 -> 高级 -> 启动和故障恢复 -> 设置 -> 编辑。
进入boot.int,将你的系统名
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="MicrosoftWindows XP Professional "
改为
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="MicrosoftWindows XP Professionalwith 3GBswitche" /3gb
重新启动,效果立现,在matlab中输入feature('memstats'),可以看到现在的实际内存已经变为了3GB。