matlab 内存处理(转)

由于在使用的过程中,由于存储单元的不断的被分配和清除,内存会被分割成不连续的区域,这是很容易造成“Out of Memory”。
1。为矩阵变量预制内存而不是动态分配
在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block来存储,这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的块,导致Out of Memory。而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续的分配内存。
比较下面两个程序:
(1)for k = 2:1000
x(k) = x(k-1) + 5;
end
(2)x = zeros(1, 1000);
for k = 2:1000
x(k) = x(k-1) + 5;
end
显然,第二个更好!!!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!!!
2。尽量早的分配大的矩阵变量
Matlab使用heap method管理内存。当在Matlab heap中没有足够的内存使用时,它会向系统请求内存。但是只要内存碎片可以存下当前的变量,Matlab会重新使用内存。所在在大内存变量clear以后,新建的小内存变量仍可以使用那部分内存空间,但相反就不行了。比如说a变量4M,b、c、d、e分别为1M,如果a被clear以后定义bcde,则可以使用a的空间,如果clear b,c,d,e以后,假如这四个变量不是连续的,那么a就不能使用它们释放的内存。
3。尽量避免产生大的瞬时变量,当它们不用的时候应该及时clear
4。将矩阵转化成稀疏形式
如果矩阵中有大量的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。
5。使用pack命令
当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。
6。如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。
7。增大虚拟内存
Windows XP,右键“我的电脑”->属性->高级->性能->设置,从而改变其虚拟内存。
8。尽量少使用系统资源(对于Windows)
Windows中字体、窗口等都是要占用系统资源的,所以在Matlab运行时尽量不要打开不用的窗口。
9。如果没有必要,不要启动java虚拟机,采用matlab -nojvm启动 (在快捷方式属性里面的 "..../matlab.exe") 改为("...../matlab.exe" - nojvm)
10。关闭Matlab Server
----------------------------------------------------------------------------------------------------------------------------------
其实回答是跟matlab没有什么太大的关系, 是memory management理论里的。
即使你的虚拟内存(virtual memory)很大, 但是并不代表你能使用这么多内存,因为
第一:跟heap space(不知道中文怎么翻译)有关系。就是说你的virtual memory 都被allocated 了(不一定是占用),那么matlab就不能创建新的变量来存储数据(比如说图片), 所以一般会出现out of memory的提示。
第二:跟你的memory fragmentation有关系,你有内存,但是内存不是连续在一起的,所以不能一次性存储大的变量,比如说你一次性load几百兆的数据进去,一般会失败的。因为matlab的工作机制是:所有变量(矩阵)必须放在连续的内存上,这个时候,即使你的内存大,也不行。当然,物理内存大,应该是可以的。

另外, 你的电脑是32bit处理器吧? 也就是说,你的电脑支持的最大内存是4G(2^16), 不过你的是3G,所以不是这个问题。但是你知道,正常情况下,windows系统,会保留2G, 所以,你真正可以用的,最多才2G.

下面我们就检查一下你的系统配置, 打开matlab, 命令行下输入:
feature('memstats')
不知道你的配置是什么,你可以看看我的配置:注意 Largest Contiguous Free Blocks那一行,我只有一个1012的,其他都比较小。
>> feature('memstats')
Physical Memory (RAM):
In Use: 561 MB (231d5000)
Free: 461 MB (1cda6000)
Total: 1023 MB (3ff7b000)
Page File (Swap space):
In Use: 553 MB (229d8000)
Free: 1906 MB (772e9000)
Total: 2460 MB (99cc1000)
Virtual Memory (Address Space):
In Use: 294 MB (1263c000)
Free: 1753 MB (6d9a4000)
Total: 2047 MB (7ffe0000)
Largest Contiguous Free Blocks:
1. [at 10020000] 1012 MB (3f460000)
2. [at 4f4a0000] 184 MB (0b8d0000)
3. [at 629c9000] 166 MB (0a637000)
4. [at 5d12a000] 88 MB (05896000)
5. [at 6d7c5000] 66 MB (042db000)
6. [at 7a548000] 26 MB (01af8000)
7. [at 5b8b4000] 23 MB (017dc000)
8. [at 73026000] 22 MB (016fa000)
9. [at 71ac7000] 21 MB (01539000)
10. [at 7e4a0000] 18 MB (01250000)
======= ==========
1632 MB (6602f000)
>>


解决方法只有2个:
1:增加你的物理内存(这个太贵了,需要花钱的)
2:增加你程序的efficiency, 尽量一次性少load数据,对于不用的变量,要及时clear,
除了这个,没有其他办法!
Tags: 

延伸阅读

最新评论

发表评论