matlab: out of memory

 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在Matlab中出现 "Out of memory"(内存不足)的错误时,这意味着你的计算机没有足够的可用内存来执行所需的操作。这可能是因为你的代码需要处理大量的数据或者使用了大量的变量。 以下是一些可能的解决方案: 1. 优化代码:检查你的代码是否存在无用的变量、循环或计算步骤。尽量减少内存占用较大的操作,如循环和复制大型矩阵。确保在不需要时及时释放变量和资源。 2. 内存管理:使用Matlab提供的内存管理函数来管理内存。例如,可以使用`pack`函数来释放未使用的内存片段,使用`clear`函数明确清除不再需要的变量。 3. 增加物理内存:如果你的计算机物理内存不足,可以考虑增加系统的内存容量。这可以通过添加更多的RAM模块或升级计算机硬件来实现。 4. 减少数据规模:如果可能,可以尝试减少数据规模,或者将数据分割成更小的部分进行处理。例如,可以只加载部分数据进行处理,而不是同时加载全部数据。 5. 使用内存优化选项:Matlab提供了一些内存优化选项,例如使用稀疏矩阵代替密集矩阵,或使用流式处理数据而不是一次性加载全部数据。 6. 使用64位版本的Matlab:如果你使用的是32位版本的Matlab,考虑切换到64位版本。64位版本能够更有效地利用大内存。 请根据你的具体情况尝试上述解决方案,并根据需要进行调整。如果问题仍然存在,请考虑咨询Matlab的技术支持或社区以获取更详细的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值