关于matlab高效管理内存的方法,进而降低Out of Memory出现的机率

                   

一、利用clear清除内存时,要用pack函数进行内存整理

Matlab在运行大数据时,会出现Out of Memory,在程序中加入clear不需要的变量,能否解决Out of Memory问题。答案是或许可以,或许不可以,

原因清除变量或者给该变量重新赋值只是释放了该变量先前分配的内存块,由于matlab是分连续块分配内存给变量,所以如果清除的这个内存空间不一定可以用上,比如,一个萝卜一个坑,为了腾出更多的坑,把不用的萝卜拔掉,然而如果来一个比较大的萝卜,先前的坑不一定能够容的下,仍然会出现Out of Memory的问题,这个时候最好用pack函数,把腾出的内存空间重新整理成连续的块,这样如果后面有较大内存占用的变量,满足内存使用的概率较大。

附pack函数的说明:

用法:

pack

pack filename

pack(‘filename’)

pack可以为用户整理内存的机制在于,pack函数重新整理MATLAB工作空间中驻留的变量,将原来断断续续的内存整理的连续起来,这样原来断断续续的内存可能不足以存储大的矩阵,而整理之后,可以很显著的提高内存的使用效率。整理步骤:

(1)将base空间以及全局变量保存到一个mat文件

(2)清空工作空间中的所有资源

(3)重新载入mat文件中保存的base空间变量和全局变量,然后删掉mat文件

这样一来,重新分配的空间将是连续的,避免掉原来断断续续的内存使用。

需要注意的是pack不能提高MATLAB所拥有的虚拟内存数量,如果想要增加这个数量,也就是使MATLAB单独变量的最大size或者同时存在的变量所占有的最大空间增大,需要提高系统的虚拟内存。

 

二、查询matlab内存使用,计算要处理的数据大小

利用命令feature(‘memstats’)或者system_dependent memstats来查看内存大小;了解自己matlab内存状况后,然后计算下自己要处理的数据容量大小,字节/1024/1024转换为MB来看更方便;

 

三、matlab内存管理

Matlab 程序跳出“Out of Memory” 时,以下几点措施是需要优先考虑的解决方法:

1. 升级内存

2. 升级64位系统

3. 增加虚拟内存

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

由于32位 Windows 操作系统的限制,每个进程只能使用最多 2GB 的虚拟内存地址空间,因此 Matlab 的可分配内存也受到相应的限制。Matlab 7.0.1 引进了新的内存管理机制,可以利用 Windows 的 3GB 开关,使用 3GB 开关启动的 Windows 每个进程可以在多分配 1 GB 的虚拟地址空间。具体做法是:修改C盘根目录 boot.ini 启动选项加上 /3G,例如:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Microsoft Windows XP Professional” /noexecute=optin /fastdetect /3G

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

6. 关闭Matlab Server

控制面板-管理工具-服务, 再找到matlabserver对应项,把启动类型的自动改为手动即可

matlab server作为后台服务可以在其它机器上通过网络调用此服务,进行计算任务。

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

除此以外,更关键的是需要弄清楚以下几个问题:

问题一:Matlab是如何存储矩阵的?

Matlab中矩阵是以Block,也就是块的形式存储的。也就是说,当Matlab在为即将存储的矩阵划分块时,如果没有相应大小的连续内存,即使实际内存没有被完全使用,它还是会报告“Out of Memory”。

问题二:如何高效使用Memory?

Matlab 中数组必须占用连续分配的内存段,当无法为新建的数组分配连续的内存段的时候,”Out of Memory” 就会出现。在使用的过程中,由于存储单元的不断的被分配和清除,反复分配和释放数组会使内存被分割成不连续的区域,可用的连续内存段减少,很容易造成“Out of Memory”。因此当 Matlab 刚刚启动时其连续内存最多,此时往往可以新建非常大的数组,这一点可以用命令 feature(’memstats’)(在 7.0 版本以上)看出。如果现实的最大连续内存段很小,但实际可用内存(非连续的)仍旧很多,则表明内存中碎片太多了。此时可以考虑用 pack 命令,pack 命令的作用就是将所有内存中的数组写入硬盘,然后重新建立这些数组,以减少内存碎片。此外,在命令行或者程序中都可以使用 clear 命令,随时减少不必要的内存。

因此,治本的方法如下:

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

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

2. 使用稀疏矩阵或将矩阵转化成稀疏形式 sparse

如果矩阵中有大量的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。例如:

000×1000的矩阵X,它2/3的元素为0,使用两种存储方法的比较:

 

Name

Size

Bytes

Class

 

X

1000x1000

8000000

double array

 

Y

1000x1000

4004000

double array (sparse)

3. 尽量避免产生大的瞬时变量,把没必要的变量clear掉或当它们不用的时候应该及时clear。

4. 减少变量,尽量的重复使用变量(跟不用的clear掉一个意思)。

5. 把有用的变量先save,后clear 掉,需要时再读出来。

下面介绍一下关于clear、save、load的特殊用法,这对在for或while等多重循环里出现out of memory非常有效。

for k = 1:N % N为循环次数

% ———————

var0 = k; % 获得变量var0

%———————-

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

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

save(sprintf(‘var_%d.mat’, k), sprintf(‘var_%d’)); % 等价于 save var_k.mat var_k

clear(sprintf(‘var_%d’)); % 等价于 clear var_k

end

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

for k = 1:N

load(sprintf(‘var_%d.mat’, k)); % 等价于 load var_k.mat k = 1,2, …, N

end

另外,还有一些非常有用的用法。如果用清除刚才读取的变量 var_k, k = 1, 2, …, N

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

还有很多关于save、clear、load等用法,具体help一下。

 

6. 使用单精度 single 短整数替代双精度 double

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

single: 精度 (1.1921e-007) 最大数 (3.4028e+038)

double: 精度 (2.2204e-016) 最大数 (1.7977e+308)

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

显然,第二个更好!!!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!!!

8. 尽量早的为大的矩阵变量预制内存

Matlab使用heap method管理内存。当在Matlab heap中没有足够的内存使用时,它会向系统请求内存。但是只要内存碎片可以存下当前的变量,Matlab会重新使用内存。比如:

a = rand(1e6,1);

b = rand(1e6,1);

使用大约15.4 MB RAM

 

c = rand(2.1e6,1);

使用近似16.4 MB RAM

 

a = rand(1e6,1);

b = rand(1e6,1);

clear

c = rand(2.1e6,1);

使用32.4 MB RAM

 

Matlab不能使用a、b被clear的空间,因为它们均小于2.1 MB,而同时它们也很可能是不连续的。最好的方法:

 

c = rand(2.1e6,1);

clear

a = rand(1e6,1);

b = rand(1e6,1);

使用16.4 MB RAM

 

9. 如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。

 

 

以上内容整理自网络:

http://wenku.baidu.com/link?url=lDn0LDCQbMktbUCuXbQqwUSwW3Nf1Yg_rMcn0r5qXJksrq_mLiN37HgXnE4hKQ1AeR_lj4doRqkNul120XLpW2cpnEywHikCQh7MoID6tLi###

http://www.ilovematlab.cn/thread-95315-1-1.html

http://blog.sina.com.cn/s/blog_6c640c790102wke5.html

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "MATLAB out of memory" 的意思是MATLAB程序使用了超过计算机可用内存的空间。这可能是由于处理过大的数据集或者不充分释放内存所导致的。要解决此问题,您可以尝试以下几个步骤: 1. 尝试释放一些内存。在MATLAB中,使用clear命令删除不再需要的变量,或使用pack命令对内存进行整理,以便MATLAB可以更好地管理可用内存。 2. 增加计算机可用内存。可以通过关闭其他占用内存的程序,或者添加更多内存到计算机中来实现。 3. 优化MATLAB代码。您可以使用更高效的算法和数据结构,以减少内存使用。 4. 将数据分批处理。如果您的数据集太大,无法一次处理,可以尝试将数据分成较小的块,并分别处理。 希望这些建议能帮助您解决MATLAB内存不足的问题。 ### 回答2: MATLAB的“out of memory”问题通常发生在当计算机上的RAM不足以为正在运行的程序提供足够的内存时。这可能会发生在执行需要大量数据的操作(例如大型矩阵的操作或频繁的I/O操作)时,或者当运行时出现内存泄漏的情况时。 要解决“out of memory”问题,可以尝试以下几种解决方案: 1.增加计算机的内存:如果计算机的RAM不足以为程序提供足够的内存,可以考虑增加计算机的内存大小,从而提高能够处理的数据量和程序性能。 2.清除内存:在MATLAB中,可以使用clear命令或者close all命令来释放内存。尽管这种方法不能解决整个内存不足的问题,但是它可以释放一些内存来继续执行程序。 3.使用稀疏矩阵:稀疏矩阵使用更少的内存来存储矩阵数据,并允许更快的计算速度。在操作数据时,可以将大型矩阵转换为稀疏矩阵,从而减少内存使用量。 4.使用前向斜杠:在执行矩阵求逆或解线性方程时,使用前向斜杠(\)运算符比使用逆(inv)函数更有效。这是因为前向斜杠使用更少的内存和计算时间。 5.优化代码:最后,可以通过优化代码来减少内存使用量。优化技术包括使用更少的变量、使用更少的循环、避免重复计算和使用更高效的算法等。 总之,“out of memory”问题是一个常见的MATLAB问题,但是有许多方法可以缓解或解决这个问题。这些方法包括增加计算机的内存,清除不必要的内存,使用稀疏矩阵,使用前向斜杠和优化代码。 ### 回答3: MATLAB出现“out of memory”的错误,表示内存被耗尽,无法继续执行程序。解决该问题通常采取以下几种方法: 1. 增加计算机的物理内存:更换更大的硬盘、增加内存条等。 2. 优化程序:对于一些比较复杂、耗费内存的程序,考虑优化算法,减少不必要的内存占用。 3. 减少数据量:对于一些特别大的数据集,可以尝试只保留必需的数据,或者将数据分割成小块进行处理。 4. 使用分布式计算:使用多台计算机进行计算,分解任务,减轻单台计算机的内存压力。 需要注意的是,“out of memory”错误一般不是MATLAB软件本身的问题,而是计算机本身的限制。因此,更有效地解决这个问题需要同时考虑软件和硬件两方面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值