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

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

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

用 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,此时就不用为变量连续的分配内存。

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

原文发布于微信公众号 - 量化投资与机器学习(ZXL_LHTZ_JQXX)

原文发表时间:2015-12-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

python读txt和xml

python随着人工智能的火热着实大火了一把,我最近在用python搭一个框架,其中用到一些很基础的功能,跟大家源码分享,不一定能入君法眼,欢迎一起讨论... ...

2655
来自专栏青玉伏案

设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)

今天是五.四青年节,祝大家节日快乐。看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火。这两道菜大部分人都应该吃过,特别是醋溜土豆丝,...

1779
来自专栏有趣的django

python开发面试问题

python语法以及其他基础部分 可变与不可变类型;  浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现;  __new__() 与 __...

4848
来自专栏编程

正则表达式游戏的答案

两天过去了,我们才送出了四个番茄钟(其中一个还是作为礼物送给了鲁鸿驹先生,感谢鲁鸿驹的现场莅临指导 ,鲁总是VIM的fans,多年不编程的他还记得是删除一行的指...

2318
来自专栏程序员阿凯

JDK10 揭秘

1605
来自专栏owent

小记最近踩得两个C++坑

记一下最近踩得两个C++独有的暗坑,其中一个和ABI相关。第二个坑其实之前研究过,但是没有实例,这次算是碰到了个典型的实例。

1142
来自专栏PPV课数据科学社区

工具 | 如何在Python中调用R语言包?

R语言是非常强大的做统计分析和建模方面的开源软件,它有非常丰富的统计软件包,做统计可以说只有你想不到的,没有R办不到的。Python又是当下最流行的编程软件之一...

1.2K8
来自专栏熊二哥

GOF设计模式快速学习

这段时间,学习状态比较一般,空闲时基本都在打游戏,和研究如何打好游戏,终于通过戏命师烬制霸LOL,玩笑了。为了和"学习"之间的友谊小船不翻,决定对以往学习过的G...

2039
来自专栏idealclover的填坑日常

C++ cin清理缓冲区

C++在用cin做输入的时候,尤其是需要输入int型值的时候,往往需要做验证与处理。而对于异常值,则需要先清理缓冲区,再准备下一次输入。

1902
来自专栏wOw的Android小站

[设计模式]之六:桥接模式

这个原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封禁,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大...

1150

扫码关注云+社区

领取腾讯云代金券