matlab: out of memory

来源:互联网 发布:对json遍历 编辑:程序博客网 时间:2024/06/14 10:38

 16G Memory exhausted.


1

Memory is allocated by OS.


Even you clear one Matrix. It can not merge with its surroundings for this part is not matlab's.


So you can directly prefix the size beforehand other than dynamic allocation.


2

for loop, in there you'd better not call subfunction.  for every calling, subfunction born and die. it generates disk fregments which 



quote:

http://blog.sina.com.cn/s/blog_6c640c790102wke5.html

7. 为矩阵变量预制内存而不是动态分配

在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block来存储,这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的块,导致Out of Memory。而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续的分配内存。比较下面两个程序:

for k = 2:1000

x(k) = x(k-1) + 5;

end

 

x = zeros(1, 1000);

for k = 2:1000

x(k) = x(k-1) + 5;

end

显然,第二个更好!!!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!!!





我对malloc和free的理解:
malloc时,假如申请了1KB的空间,那么操作系统有可能给你一个大于1KB的数值用以备用。同时,malloc时会用一个tag记录本次申请空间的大小,free的时候仅仅将tag清零。
但我有两个问题,比如在基于glibc的Linux中:
1.malloc之后如果不free,那么进程正常(或异常)结束后,操作系统是否一定会对这块内存进行回收呢?
2.malloc之后如果调用了free,那么有没有什么情况下,操作系统不对这块内存进行回收呢?或者说暂时不进行回收呢?



作者:蓝色
链接:https://www.zhihu.com/question/29161424/answer/43443758
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

1 会的,内存也是资源,操作系统会回收的。若不回收,你每次都异常退出去,多来几次,那岂不是你的内存直接就没了(<del>又不是三国杀的马岱直接砍体力上限,直接砍的吃桃都不行</del>)

2. 若是glibc,你所free掉的内存,不一定会马上被OS回收,这是合理的。试想一下,你每次free掉的内存都还给OS的话,尤其是在小字节的情况下,那么造成的情况,就是一大块的内存被你弄的千疮百孔,也就是说一块内存,里面有很多gap。而在操作系统的虚拟内存管理中,更是管理着的是固定大小的内存,如4K,那你还给我1 Byte,OS显然是很尴尬的。于是为了避免这样的问题,那么内存管理一般会有一个free block list,free掉的东西就放在这里来。那么你可能会释放很散乱的内存过来,没关系,我们在这里会尝试合并这些散乱的block,而malloc首先找的也是free block list,而非从OS申请新的内存。那么此时如果找到了一块儿合适的自然最好,如果找到的是比要的更大,那么一部分malloc,另一部分放回去。而上面有同学提到了小内存的问题,而这也是free block list在头部会有一些所谓的administrative data,所以用标准的malloc和free管理小内存是不高效,因为越小越容易造成gap。当然,由于malloc和free是如此普遍,自然会尝试着让它变的更好,所以也有各种优化,如对free block list进行chunk size排序等,不过这里就不提了,再谈下去,问题就很大了,这块儿也是有专门的Memory Management书籍讨论的。

0 0
原创粉丝点击