前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【干货】Matlab的内存问题讨论

【干货】Matlab的内存问题讨论

作者头像
量化投资与机器学习微信公众号
发布2018-01-29 11:13:03
1K0
发布2018-01-29 11:13:03
举报

谢谢大家支持,可以让有兴趣的人关注这个公众号。让知识传播的更加富有活力,谢谢各位读者。 很多人问我为什么每次的头像是奥黛丽赫本,我只能说她是我女神,每天看看女神也是不错的嘛!

查看之前博文点击右上角关注且查看历史消息

用 Matlab进行大规模科学计算或仿真时,内存是一个需要时常注意的问题。在matlab命令输入行中输入: system_dependentmemstats 。

在这里就可以看到内存的使用情况了。当你写的 Matlab程序跳出“Out ofMemory” 时,以下几点措施是需要优先考虑的解决方法:

1.升级内存

2.升级64位系统

3.增加虚拟内存

4.采用3GB开关启动系统

使用3GB切换

(1)在“开始”菜单下的“附件”程序组中,右击“命令提示器”(CommandPrompt)。点击“使用系统管理员身份运行”(Run asAdministrator)。

(2)在命令提示器中输入“bcdedit/set IncreaseUserVa 3072”

(3)重启电脑。

打开3GB的目的:32位系统(包括XP和32位的win7),默认情况下不允许某个程序调用超过2G的内存,一旦超过,就自动结束掉该程序。因此打开3GB,就是为了允许大型程序,调用最多3G的内存

5.如果没有必要,不要启动java虚拟机,采用matlab-nojvm启动(在快捷方式属性里面的"..../matlab.exe")改为("...../matlab.exe"- nojvm)

6.关闭MatlabServer

7. Windows中字体、窗口等都是要占用系统资源的,所以在Matlab运行时尽量不要打开不用的窗口

8.在命令行输入 pack 整理内存空间

当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。

9.以上所说的方法都是一些基础的方法,是从外界的角度来解决问题,实际上最本质的方法还是养成一个好的编程习惯

(1)尽量避免产生大的瞬时变量,把没必要的变量clear掉或当它们不用的时候应该及时clear;减少变量,尽量的重复使用变量;把有用的变量先save,后clear 掉,需要时再读出来。下面介绍一下关于clear、save、load的特殊用法,这对在for或while等多重循环里出现out ofmemory非常有效。

fork = 1:N % N为循环次数

var0 = k; % 获得变量var0

string = [sprintf('var_%d', k) ' = var0;'];

eval(string); % 等价于 var_k = var0;

save(sprintf('var_%d.mat', k),sprintf('var_%d'));

% 等价于 save var_k.matvar_k

clear(sprintf('var_%d')); % 等价于 clearvar_k

end

如果要读取刚才存取的变量var_k,(k = 1,2, ..., N). 那么,可以使用如下用法:

fork = 1:N

load(sprintf('var_%d.mat', k)); % 等价于 loadvar_k.mat k = 1,2, ..., N

end

如果用清除刚才读取的变量 var_k,k = 1, 2, ..., N

clear '-regexp''^var_' % 清除所有以“ var_ ”开头的变量

(2)使用单精度 single短整数替代双精度 double

Matlab 默认的数字类型是双精度浮点数 (double),每个双浮点数占用 8 个字节。对于一些整数操作来说,使用双浮点数显得很浪费。在 Matlab 中可以在预先分配数组时指定使用的数字类型如以下命令:zero(10, 10, ‘uint8′) 。对于浮点数,在很多精度要求不高的情况下,可以使用4个字节的单浮点数 (single),可以减少一半的内存。

(3)为矩阵变量预制内存而不是动态分配

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

还有一些其他的内存管理方法,但以上所述是一些比较常用的方法,但是最主要的还是自己的编程习惯,要养成一个好的编程习惯是很重要的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量化投资与机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档