很全的内容,所以整理、方便以后查看 ----------------------------------------------------------------------------------------------------------------------------------------------------------------- 一、利用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 X Y Size 1000x1000 1000x1000 Bytes 8000000 4004000 Class double array double array (sparse) 3. 尽量避免产生大的瞬时变量,把没必要的变量clear掉或当它们不用的时候应该及时clear。4. 减少变量,尽量的重复使用变量(跟不用的clear掉一个意思)。5. 把有用的变量先save,后clear 掉,需要时再读出来。
|
|