Matlab内存问题

起因是这样的,上周四上课的时候要画一个正态分布函数,我想都没想直接去了randn(10000),就是一亿个数据,结果用hist函数画图的时候,半天没有反应,居然溢出了。
mlgb的,我平常处理雷达图像的时候你溢出溢出我也就忍了,毕竟数据量是大,我也知道,windows搞不定,必须要用实验室的linux台式机;可如今弄个正态分布你都给我溢出,这是闹那般啊?!
实在不能忍,想起了matlab可以用那个经典的3G switch,于是google百度matlab 3G switch,按照教程一步一步来,果真设置没问题。之前可读的内存也就大概2G左右,如今virtual memory那一项明显增大到了3G.
这下可以了吧,于是兴冲冲地回到matlab 2011a,重新画我的正态分布函数。

马勒戈壁的,又溢出了!

我想不通啊,怎么搞的!不就算个正态分布么你都给我溢出,pack啊什么的指令统统没用,于是我愤怒了。
就当我不知错所考虑要不要买新电脑的时候,我顺手打开了电脑里的matlab 2009a(因为有一个程序是用2009a编译的,所以我一直留着2009a,只不过不怎么用),鬼使神差地又输入了一次相同的指令。
卧槽,居然出来了!

于是我茫然啊,怎么低版本反而比高版本更牛逼啊,想不通啊!

顺手打开matlab的memory指令和feature memstats,仔细看看,我终于明白了。

如果你输入memory指令,几个参数是这样的:
Maximum possible array:            1208 MB (1.267e+009 bytes) *
Memory available for all arrays:   2381 MB (2.497e+009 bytes) **
Virtual Memory (Address Space):
        Total:                              2899 MB (b53e0000)
虽然换成3GB开关后,total virtual memory都是3GB了,但并不是3GB你都能用的,其实最重要的是上面两个参数。第一个,是能储存的最大数组的大小,第二个是能储存的所有数组的大小。也就是说,虽然我这里有2899MB的内存供matlab使用,其实最多能用到2381MB来储存数组,其他的,程序的别的地方也要用啊。而当我打开matlab 2009a和2011a的时候,输入相同的指令,我发现,结果居然是完全不一样的!!

作为一个强烈的偏执症患者,我周末唯一做的一件事情,就是测试了几乎所有主流matlab版本的内存性能。安装matlab是一个漫长的坑爹的过程,我把结果罗列如下。

特此说明:以下结果是在同一操作系统、同一环境下,同时打开所有版本的matlab,输入同样的操作指令memory和feature memstats得出的结果,仅供参考(2011a除外,因为我后来手一抖把2011a删了,实在实在不想再装了……)。
操作系统系能:XP SP3操作系统,32位
CPU Intel Core2 Duo CPU P8600 @2.40GHz
3GB 物理内存,4.5GB虚拟内存

 

Matlab 7.0

Matlab 7.1 sp3

Matlab 2008a

Matlab 2009a

Matlab 2009b

Matlab 2010a

Matlab 2011a

Maximum possible array(能存放的最大数组)

1170M

1197M

1370M

1208M

1370M

1215M

950M

Memory available for all arrays(能存放数组的最大空间)

2414M

2454M

2470M

2381M

2419M

2353M

 

Memory used by MATLAB(Matlab使用内存)

3066M

3066M

3067M

3067M

3067M

3067M

3067M

Physical Memory (RAM)(物理内存)*

使用

954M

790M

942M

959M

934M

792M

 

空闲

2112M

2276M

2124M

2107M

2132M

2274M

 

总共

3066M

3066M

3066M

3066M

3066M

3066M

3066M

Page File (Swap space):(交换页)*

使用

864M

681M

848M

969M

994M

697M

 

空闲

6674M

6857M

6691M

6569M

6544M

6841M

 

总共

7539M

7539M

7539M

7538M

7538M

7539M

7539M

Virtual Memory (Address Space)(虚拟内存)*

使用

333M

296M

451M

526M

481M

464M

 

空闲

2566M

2603M

2447M

2373M

2418M

2435M

 

总共

2899M

2899M

2899M

2899M

2899M

2899M

2899M

Largest Contiguous Free Blocks:(最大连续存储块)**

第一块

1170M

1197M

1369M

1207M

1369M

1215M

950M

第二块

851M

851M

851M

850M

850M

850M

850M

总共

2414M

2454M

2415M

2288M

2353M

2353M

 

*这三项值即是是同一版本,每次输入也会有变动,但变动总体不大。
**基本为固定值。最大连续存储块的第一块这个值和上面能存放的最大数组的值相对应,总共大小和能存放的数组最大空间相对应。


从这个表格中,我们可以得出以下结论:
一、所有测试结果的物理内存、交换页和虚拟内存的总数是一样的。但是有这么一个趋势,即版本越高,这三项占用的大小会 越大。但总的对我的电脑来说,都是足够了。
二、即是是同一操作系统,不同的版本,最大连续存储块的值也是不一样的。于是这也解释了同一操作,为什么有的版本会溢出,为什么有的版本能算数来了。

总的来说,有这么一个趋势,只看a版本,就是随着版本越高,能存放数组的最大空间大小会越来越小,第一块(能存放的最大数组空间)的数值也在变小。这大概也很好理解,版本高了,加载的东西多了,启动一个matlab可能会多调用很多东西,因此能使用的空间也小了。我那引以为豪的最新2011a本版,居然当初只有可怜的950M,跟别的一比,难怪随便算个东西就溢出了。

7.1实际上是7.0版本的sp3补丁,因此总体性能全部优过7.0,这个不足为怪。即是放到所有版本中,matlab7.1的能存性能也是出众的,因此强烈推荐大家使用这个版本。
除此之外,2008a也是一个不错的版本,本来就是一个经典版本,从性能来看,似乎也很不错,存放的最大数组居然达到了1370M,比7.1版本还好的多,让我很开心。
2009a版本似乎有些bug,总体性能很一般,几乎跟2010a一模一样,却差了2008a挺大一截,而且2009a安装的时候有特别严重的bug,只要我选择自定义安装,每到97%的时候必定会出现模块注册失败报错的现象,完全安装却没有问题,研究两天未果,虽然好像目前看不出报错的后果在那里,但是报错本身,已经足够让我这个偏执症患者火冒三丈了,而我又特别不想装三四个G的无用的模块到我电脑里……可是我一直用的那个图像处理软件却是2009a编译的,所以我还必须用2009a或以后版本,崩溃啊……
2011a就不说了,只能说我电脑挫,等我有了64位操作系统再来装吧……
就在昨天晚上,我突然想到我从来没有装过b版本,那这一次就装b吧,但愿这次装b不会遭雷劈。下了一晚的2009b的种子,自定义安装,memory,哇,性能居然如此优良,整体性能都比2009a好了一截,简直和2008a没有任何区别,真是甚合我意啊。原因?既然matlab自己都说了b主要是对a版本的补丁,那么我猜b是把傻*的a改的更好了?我猜是吧。

通过这一番折腾,我终于把matlab各个版本搞得差不多了,以后再也不想再装matlab了……至于别的版本,什么2008b啊,2007a啊,欢迎大家测试,如果真有蛋疼的测试了所有的,欢迎告诉我结果……

赶紧用matlab继续苦逼地干活去……
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 内存泄漏是指在程序运行期间,分配的内存空间没有被及时释放,导致无法再次访问或回收的问题。对于Linux和Matlab内存泄漏可能发生在不同层面。 在Linux操作系统中,内存泄漏可能是由于程序的编写错误或设计缺陷而导致的。一些常见的原因可能包括:未正确释放动态分配的内存、使用了不适当的内存管理函数、无效的内存指针操作等。为了解决这个问题,可以采取以下方法:使用合适的内存管理函数(如malloc和free)来进行动态内存分配和释放、编写严谨的代码并进行内存泄漏的测试和调试、使用内存检测工具(如valgrind)来进行静态和动态的内存泄漏检测。 在Matlab中,内存泄漏的原因可能是由于不恰当的变量处理、大量临时变量分配和未及时清理等。为了解决这个问题,可以采取以下方法:使用合适的变量处理方式,尽量减少临时变量的使用、对于大型数据结构,及时清理不再使用的变量和对象、使用Matlab自带的内存检测工具(如memory)来查看内存使用情况、使用Matlab内存管理函数(如clear和pack)来及时释放未使用的内存。 总的来说,解决Linux和Matlab中的内存泄漏问题需要结合对应的编程语言特性和工具进行调试和优化。通过合理的内存管理和编写规范的代码,可以减少内存泄漏问题的发生,并提高程序的性能和稳定性。 ### 回答2: Linux和Matlab都有可能出现内存泄漏问题。 在Linux操作系统中,内存泄漏是指程序在分配内存后,无法正确释放内存空间,导致内存占用不断增加,最终会耗尽可用内存资源。内存泄漏问题在Linux中比较常见,一般是由于程序中存在未释放的堆内存、文件描述符或其他资源导致的。 而在Matlab中,内存泄漏问题通常指的是Matlab程序运行时无法正确释放已经分配的内存空间,导致内存占用不断增加。这个问题可能是由于Matlab程序中存在不当的循环引用、未清理的变量引用或其他内存资源未释放等原因造成的。 要解决Linux和Matlab内存泄漏问题,可以采取以下方法: 1. 在Linux中,使用一些工具如Valgrind等,进行内存泄漏检测和分析,可以定位到具体的内存泄漏位置和原因。然后根据具体情况,修改程序代码,正确释放内存空间。 2. 在Matlab中,可以使用Matlab内置工具进行内存泄漏检测,如Matlab自带的内存分析工具profiler。通过分析程序运行时的内存使用情况,找出可能存在的内存泄漏点,并进行相应的优化和修改。 3. 在编写程序时,注意及时释放分配的内存空间和其他资源,避免出现未释放资源的情况。可以使用合适的编程技巧和规范,如使用智能指针、垃圾回收机制等,来减少内存泄漏的风险。 总之,要解决Linux和Matlab内存泄漏问题,需要通过工具检测和分析,找出具体的内存泄漏点,然后进行代码优化和修改,保证程序能够正确释放内存空间,从而避免内存泄漏问题的发生。 ### 回答3: 在 Linux 系统中,MATLAB 内存泄漏问题是指在运行 MATLAB 时,由于程序设计不当或资源管理失误而导致内存无法被有效释放而积累的现象。 MATLAB 是一种资源密集型的计算软件,它在运行过程中需要大量的内存来存储数据和计算结果。如果程序设计不当,或者在使用过程中没有正确管理内存,就可能导致内存泄漏问题的发生。 内存泄漏通常会表现为内存占用越来越高,甚至最终导致程序崩溃或系统变得不稳定。例如,在使用循环时没有正确释放内存,或者使用了大量的全局变量导致内存无法被回收等情况下,就可能发生内存泄漏。 解决 MATLAB 内存泄漏问题的方法可以从以下几个方面入手: 1. 检查程序中的循环和迭代操作,确保在循环结束后及时释放不再使用的变量和数据结构。 2. 减少使用全局变量,尽量使用局部变量,以便及时释放内存。 3. 合理使用 MATLAB内存管理功能,比如手动释放不再使用的大型数据对象,使用 clear 或者 delete 方法。 4. 优化内存分配和释放的顺序,避免频繁地进行内存分配和释放操作。 5. 可以使用 MATLAB 的性能分析工具来定位内存泄漏问题所在,找到具体的代码位置进行修改。 需要注意的是,由于 MATLAB 是商业软件,具体的解决方法可能因版本和具体应用而有所不同。因此,如果遇到内存泄漏问题,建议先查看 MATLAB 官方文档或联系 MathWorks 公司的技术支持来获取更具体的指导。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值