如果你的系统是32位系统(进程最大支配2G空间,另外2G给系统进程了),在使用matlab 运行耗内存程序时候,会可能出现 out of memory 错误。这是因为matlab没有足够内存可以使用的缘故。解决的简单方法是加内存和升级为64位系统了。

matlab具体能支持多大的数据呢?我们可以使用memory命令来查询。可以在matlab命令行输入 memory 看看你的系统的限制

我的系统是:

memory
 Maximum possible array:            1451 MB (1.521e+009 bytes) *    当前系统数组能占的最大内存
 Memory available for all arrays:   1451 MB (1.521e+009 bytes) *    当前系统变量可被分配的空间
 Memory used by MATLAB:              126 MB (1.320e+008 bytes)    已经使用的内存数量
 Physical Memory (RAM):             2038 MB (2.137e+009 bytes)     系统物理内存数量* Limited by System Memory (physical + swap file) available. 打星号表示受限于系统内存和交换空间的大小
除了升级内存和升级64位系统外,下面几个方法也是解决之道。
# 增加虚拟内存
 # 采用PACK (在命令行输入 pack 整理内存空间)
 # 采用3GB 开关启动系统(修改 c盘根目录 boot.ini 启动选项加上 /3G 例如:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G   重新启动系统再次运行matlab。# 优化程序,减少变量 (使用稀疏矩阵 sparse ) save 保存变量 clear 变量 load 变量,需要时再读出来
 # 如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动 (在快捷方式属性里面的 "..../matlab.exe") 改为("...../matlab.exe" - nojvm)
 #关闭Matlab Server  # 使用 单精度 single 短整数替代 双精度。


 

 

Matlab 内存管理

用 Matlab 进行大规模科学计算或仿真时,内存是一个需要时常注意的问题。当你写的 Matlab 程序跳出“Out of Memory” 时,以下几点措施是需要优先考虑的解决方法:

1. 确保内存的连续性

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

 2. 3GB 开关

 由于32位 Windows 操作系统的限制,每个进程只能使用最多 2GB 的虚拟内存地址空间,因此 Matlab 的可分配内存也受到相应的限制。Matlab 7.0.1 引进了新的内存管理机制,可以利用 Windows 的 3GB 开关,使用 3GB 开关启动的 Windows 每个进程可以在多分配 1 GB 的虚拟地址空间,具体的操作方法可见:http://www.mathworks.com/support/tech-notes/1100/1106.html 3. 减少使用双浮点数 Matlab 默认的数字类型是双精度浮点数 (double),每个双浮点数占用 8 个字节。对于一些整数操作来说,使用双浮点数显得很浪费。在 Matlab 中可以在预先分配数组时指定使用的数字类型如以下命令:zero(10, 10, ‘uint8′) 。对于浮点数,在很多精度要求不高的情况下,可以使用4个字节的单浮点数 (single),可以减少一半的内存。关于单、双浮点数的精度对照如下,以便根据需要选择使用:

single: 精度 (1.1921e-007) 最大数 (3.4028e+038)
double: 精度 (2.2204e-016) 最大数 (1.7977e+308)