网站首页 > 资源文章 正文
总结了下大家对于运行MATLAB代码,显示内存不足的问题,在网上进行调研,总结如下:
一般out of memenry存在以下几种情况:
1、 变量需要的存储空间超过了可用的内存空间
2、 数据需要的存储空间,超过内存中最大的可用连续存储空间
3、程序和问题求解方法的设计不周,导致内存溢出。
在MATLAB命令窗里运行 system_dependent memstats,可以看到内存的使用情况。
1. 增加虚拟内存
Windows XP,右键“我的电脑”->属性->高级->性能->设置,从而改变其虚拟内存。
Windows 7,右键“计算机”->属性->(左边栏)高级系统设置->高级->(性能)设置->高级->(虚拟内存)更改,建议物理内存的两倍左右,如果物理内存已经3G+,那就不用调整了。
2. 插根内存条
3. 换成64位的软件和操作系统
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 XPProfessional” /noexecute=optin /fastdetect /3G
5. 使用GPU
6. 如果有必要,不要启动java虚拟机,采用matlab -nojvm启动 (在快捷方式属性里面的"…/matlab.exe") 改为("…/matlab.exe" - nojvm)
7. 关闭Matlab Server
控制面板-管理工具
8. 使用pack命令
当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。
9.**尽量少使用系统资源(对于Windows)
Windows中字体、窗口等都是要占用系统资源的,所以在Matlab运行时尽量不要打开不用的窗口。
10. 对代码进行优化:
1)多数情况是你的计算中间结果太大了,简单的处理办法是把不需要的中间结果在迭代退出或者进入下一次之前clear掉。(尽量避免产生大的瞬时变量,当它们不用的时候应该及时clear)
2)将普通矩阵转换成稀疏矩阵来处理,如果矩阵中有大量的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。
3)将矩阵进行分块处理,如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。
4)分布式矩阵,并行工具箱的功能。
5)为矩阵变量预制内存而不是动态分配:
在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block来存储,这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的块,导致Out of Memory。而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续的分配内存。
6)尽量早的分配大的矩阵变量:
Matlab使用heap method管理内存。
当在Matlab heap中没有足够的内存使用时,它会向系统请求内存。
但是只要内存碎片可以存下当前的变量,Matlab会重新使用内存。
所在在大内存变量clear以后,新建的小内存变量仍可以使用那部分内存空间,但相反就不行了。比如说a变量4M,b、c、d、e分别为1M,如果a被clear以后定义bcde,则可以使用a的空间,如果clear b,c,d,e以后,假如这四个变量不是连续的,那么a就不能使用它们释放的内存。
总结:
- 优化代码:检查代码中是否存在冗余的变量或计算步骤,尽量减少内存使用量。
- 增加系统内存:如果可能的话,增加计算机的物理内存可以提供更多的可用内存供MATLAB使用。
- 减少数据集大小:如果数据集过大,可以考虑减少数据集的大小或者只加载部分数据进行处理。
- 使用稀疏矩阵:对于大型矩阵,可以使用稀疏矩阵来减少内存占用。
- 分块处理:将大型数据集分成较小的块进行处理,以减少内存使用量。
- 清理不需要的变量:在处理完一个变量后,及时清除不再需要的变量,以释放内存空间。
- 使用内存映射:MATLAB提供了内存映射工具,可以将数据存储在磁盘上,并通过内存映射进行访问,从而减少内存占用。
- 使用parfor循环:如果你的计算可以并行执行,可以考虑使用parfor循环来利用多个处理核心,从而减少内存使用量。
- 使用MATLAB编译器:将MATLAB代码编译成可执行文件或者使用MATLAB Coder生成C/C++代码,可以提高代码的执行效率和减少内存占用。
猜你喜欢
- 2024-10-01 搞定电路设计之适于树莓派的±10V模拟输入和±15V模拟输出I/O模块
- 2024-10-01 MATLAB的简单使用(matlab简单用法)
- 2024-10-01 Matlab精彩绘图示例和代码分享(matlab绘制好看的图)
- 2024-10-01 Matlab中的基本数据类型介绍(matlab概述及基本数值运算)
- 2024-10-01 有关在matlab中对信号采样及频谱的一些解释;复数的频谱,高分辨率谱,高密度谱的一些理解
- 2024-10-01 你写过哪些比较酷的 Matlab 代码?十行以内
- 2024-10-01 Matlab 2016b详细安装步骤(matlab2016a的安装教程)
- 2024-10-01 MATLAB基础学习之绘图操作(一)(matlab绘图教程详细)
- 2024-10-01 地球抛物与宇宙速度的MATLAB数值解法(ode45)
- 2024-10-01 MATLAB求解规划问题(线性规划, 整数规划, 非线性规划)
你 发表评论:
欢迎- 05-1430个在线地图瓦片URL分享
- 05-1425个在线地图瓦片URL分享
- 05-14PixelStyle for Mac(mac照片编辑器)
- 05-14一篇文章带你了解CSS3 3D 转换知识
- 05-14我们的世界是假的?马斯克:我们生活在高文明模拟的矩阵游戏中
- 05-14【视觉AI的基石】斯坦福大学笔记!带你吃透卷积神经网络 (CNN)
- 05-14潮流 | 通过AAPE的新价目,无虑入荷未来主义服饰
- 05-14身份证查询服务API:准确识别身份证信息
- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)