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继续苦逼地干活去……

你可能感兴趣的:(Matlab内存问题)