找回密码
 注册
Simdroid-非首页
查看: 118|回复: 4

Matlab 内存管理 [转载]

  [复制链接]
发表于 2011-7-22 13:54:35 | 显示全部楼层 |阅读模式 来自 广东广州
本帖最后由 messenger 于 2011-7-22 13:58 编辑

今天用Matlab跑程序,由于数据量太大,又出现 Out of memory. Type HELP MEMORY for your options.的问题。看到这篇文章非常实用,转过来方便查阅~

用 Matlab 进行大规模科学计算或仿真时,内存是一个需要时常注意的问题。在matlab里运行

>>system_dependent memstats

就可以看到内存的使用状况。当你写的 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. 如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。
经过保存需要的变量,删除不必要的变量,运行pack命令,系统前后的内存占用情况有了很大改善:
这是清理之前:

>> memory
Maximum possible array:              15 MB (1.622e+007 bytes) *
Memory available for all arrays:    194 MB (2.036e+008 bytes) **
Memory used by MATLAB:             1549 MB (1.624e+009 bytes)
Physical Memory (RAM):             4095 MB (4.294e+009 bytes)

*  Limited by contiguous virtual address space available.
** Limited by virtual address space available.
这是清理之后:
Maximum possible array:             252 MB (2.641e+008 bytes) *
Memory available for all arrays:    988 MB (1.036e+009 bytes) **
Memory used by MATLAB:              762 MB (7.991e+008 bytes)
Physical Memory (RAM):             4095 MB (4.294e+009 bytes)

*  Limited by contiguous virtual address space available.
** Limited by virtual address space available.
文章转自:http://blog.sina.com.cn/s/blog_6bbd2dd10100pjo5.html
 楼主| 发表于 2011-7-22 13:54:40 | 显示全部楼层 来自 广东广州

Windows 32位系统 大内存 3GB开关 Matlab 内存管理

Simdroid开发平台
本帖最后由 messenger 于 2011-7-22 13:59 编辑

KB : 328882

/3GB 开关
默认情况下,Windows 可以对总计 4 千兆字节 (GB) 的虚拟地址空间进行寻址。默认情况下,此地址空间中的 2 GB 为内核(操作系统)保留,另外 2 GB 是为用户模式程序(如 Exchange 2000 Server)保留的。

当您将 /3GB 开关放入操作系统的 Boot.ini 文件中时,您就重新分配了虚拟地址空间,给用户模式程序提供 3 GB 的空间,同时将内核限制为 1 GB。

重要说明:只有在以下操作系统中可以使用 /3GB 开关:
• Microsoft Windows Server 2003 Enterprise Edition
• Microsoft Windows Server 2003 Datacenter Edition
• Microsoft Windows Small Business Server 2003
• Microsoft Windows XP Professional
• Microsoft Windows 2000 Advanced Server
• Microsoft Windows 2000 Datacenter Server
• Microsoft Windows NT 4.0 Enterprise Server

在以下操作系统中不要使用 /3GB 开关:
• Microsoft Windows 2000 Server
• Microsoft Windows NT 4.0 Server

Windows 2000 Server 和 Windows NT 4.0 Server 只可以为用户模式程序分配 2 GB。如果您在 Windows 2000 Server 或 Windows NT 4.0 Server 中使用 /3GB 开关,则会将 1 GB 分配给内核,将 2 GB 分配给用户模式程序,因而您将丢失 1 GB 的地址空间。

当您的计算机中安装的物理内存超过 1 GB 后,用户模式程序的 2GB 虚拟内存地址会导致 Exchange 2000 Server 中出现若干问题。

Exchange 2000 Server 基于物理内存数量计算分配给数据库缓冲区的内存。物理内存超过 1 GB,可能导致将不相称的 2 GB 虚拟内存分配给数据库缓冲区。这可能导致虚拟内存分段故障、性能问题或“内存不足”问题。
注意:如果您仍遇到内存故障,请从服务器中删除一些 RAM 以将其减小至 1GB 或更少。这有助于您确认本文中描述的情况是不是此问题的根源。


基于 Windows 2000 Advanced Server 的计算机上的 Exchange 2000 Server
当基于 Windows 2000 Advanced Server 的计算机拥有超过 1 GB 的物理 RAM,请在 Boot.ini 中使用 /3GB 开关,使用户模式程序(如 Exchange 2000 Server)可以访问 3 GB 的虚拟地址空间。

基于 Windows 2000 Datacenter Server 的计算机上的 Exchange 2000 Server
在基于 Windows 2000 Datacenter Server 的计算机上,当物理 RAM 超过 1 GB 时,请使用 /3GB 开关。Exchange 2000 Server 需要在 Windows 2000 Datacenter Server 上支持的 Service Pack 1 (SP1)。

/PAE 开关
物理地址扩展 (PAE) 是 Windows 2000 Datacenter Server 和 Windows 2000 Advanced Server 的一项功能,为此 API 编写的程序能够使用 4 GB 以上的内存。虽然有专门为利用此 API 而编写的程序,例如 Microsoft SQL Server 2000,但 Exchange 2000 Server 与其不兼容。因此,如果您使用 /3GB 开关,Exchange 2000 Server 只能对 3 GB 的地址空间进行寻址。
PS: 请留意上文中标蓝段落, M$ 只是将 Exchange 用来做例子,因为 Exchange 是 M$ 自己的产品。

PS: 版内有没有 PhotoShop 、CD 或其他需要频繁操作上百甚至上G文件的朋友? 有的话,请留意下面:

来至 kb.adobe.com , ID :332271
If you are running Windows XP Professional with Service Pack 2, you can set the 3 GB switch in the boot.ini file, which allows Photoshop to use up to 3 GB of RAM.


先检查主板是否支持,下载everest检测软件,在主板-内存一项中,Physical Address Extension(PAE)查看“操作系统支持”“处理器支持”是否为“是”,如果是“否”的话代表主板不支持,不要玩了,如果是“是”的话,“活动”一项是“否”也有可以修改的可能,

参考: 新进化论 博客http://www.cnblogs.com/jjkv3/archive/2008/11/14/1333448.html

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)
参考:
Deng’s blog

文章转自:http://hi.baidu.com/zwwcqu/blog/item/e3b34235c8560f49241f1474.html
回复 不支持

使用道具 举报

 楼主| 发表于 2011-7-22 13:54:43 | 显示全部楼层 来自 广东广州

Matlab 的内存分配机制

本帖最后由 messenger 于 2011-7-22 14:01 编辑

1、创建和修改数组——基本思想是保持内存的连续性
(1)当为数组赋值时,Matlab在内存中分配连续的虚拟块,在另一个地方,将数组的类型和维数等保存为头信息。
(2)当向数组增加新元素时,如果原来位置的连续内存区域可以容纳新增加的数据,则扩大分配的内存,然后增加元素;如果连续块不够大,需要先重新分配能够容纳原有数据和新增数据的连续内存块,再将原有数据拷贝到新分配的内存中(在此期间,内存中会有原来数据的两份拷贝,增加了out of memory的风险),并添加新的元素到新的块中,然后释放原来的内存。
(3)当删除数组元素时,先移除元素,再压缩原来分配的空间。
2、数组的拷贝
(1)当将一个数组赋值给另一个变量时,不会为新变量分配内存,新变量只是到原来数组的引用,直到新变量中元素值改变时,才会为其分配内存。
(2)通过参数传递给函数的数据,当数据内容发生改变时才会分配内存,函数内部新的数据通过返回值传递给调用该函数的函数。
3、数组头
(1)由于数组头占据存储空间(虽然不多),数据存放在几个大数组中要由于存放在多个小数组中。
(2)对结构体和元胞(cell)数组,Matlab不仅为他们创建头信息,还为结构体的每个字段和元胞数组的每个元素创建头信息,因此结构题和元胞数组消耗的内存与其创建方式有关。
(3)whos函数只能查看数据占用的存储空间,不会显示头信息占用的空间。
4、数据结构与内存
(1)8-bit、16-bit、32-bit、64-bit的有符号整型或无符号整型分别占用1、2、4、8字节空间,单精度、双精度浮点数分别占用4、8字节空间。
(2)复数的实部和虚部分别占用存贮空间,当修改实部或虚部时,会同时复制实部和虚部。
(3)当数组的元素绝大部分为0时,用稀疏矩阵存贮以节省空间。
5、内存占用计算
(1)元胞数组占用的空间计算方法为:(header_size x number_of_cells) + data,对于64位系统,header_size为112,查看header_size的方法: A = {[]}, whos A。A = {1 2 3}, A = {[1 2 3]}, A = {{1 2 3}}占用的字节数分别为:112×3+8×3,112×1+8×3,112×4+8×3。
(2)64bit系统中结构体占用空间的计算方法:fields x ((112 x array elements) + 64) + data (32bit系统中将112改为60)。

文章转自:http://hi.baidu.com/jiyeqian/blog/item/63f7222aa11fac8d023bf679.html
回复 不支持

使用道具 举报

 楼主| 发表于 2011-7-22 13:54:45 | 显示全部楼层 来自 广东广州

windows XP 支持 4GB内存的问题

本帖最后由 messenger 于 2011-7-22 14:05 编辑

KB : 328882

/3GB 开关
默认情况下,Windows 可以对总计 4 千兆字节 (GB) 的虚拟地址空间进行寻址。默认情况下,此地址空间中的 2 GB 为内核(操作系统)保留,另外 2 GB 是为用户模式程序(如 Exchange 2000 Server)保留的。

当您将 /3GB 开关放入操作系统的 Boot.ini 文件中时,您就重新分配了虚拟地址空间,给用户模式程序提供 3 GB 的空间,同时将内核限制为 1 GB。

重要说明:只有在以下操作系统中可以使用 /3GB 开关:
• Microsoft Windows Server 2003 Enterprise Edition
• Microsoft Windows Server 2003 Datacenter Edition
• Microsoft Windows Small Business Server 2003
• Microsoft Windows XP Professional
• Microsoft Windows 2000 Advanced Server
• Microsoft Windows 2000 Datacenter Server
• Microsoft Windows NT 4.0 Enterprise Server

在以下操作系统中不要使用 /3GB 开关:
• Microsoft Windows 2000 Server
• Microsoft Windows NT 4.0 Server

Windows 2000 Server 和 Windows NT 4.0 Server 只可以为用户模式程序分配 2 GB。如果您在 Windows 2000 Server 或 Windows NT 4.0 Server 中使用 /3GB 开关,则会将 1 GB 分配给内核,将 2 GB 分配给用户模式程序,因而您将丢失 1 GB 的地址空间。

当您的计算机中安装的物理内存超过 1 GB 后,用户模式程序的 2GB 虚拟内存地址会导致 Exchange 2000 Server 中出现若干问题。

Exchange 2000 Server 基于物理内存数量计算分配给数据库缓冲区的内存。物理内存超过 1 GB,可能导致将不相称的 2 GB 虚拟内存分配给数据库缓冲区。这可能导致虚拟内存分段故障、性能问题或“内存不足”问题。
注意:如果您仍遇到内存故障,请从服务器中删除一些 RAM 以将其减小至 1GB 或更少。这有助于您确认本文中描述的情况是不是此问题的根源。


基于 Windows 2000 Advanced Server 的计算机上的 Exchange 2000 Server
当基于 Windows 2000 Advanced Server 的计算机拥有超过 1 GB 的物理 RAM,请在 Boot.ini 中使用 /3GB 开关,使用户模式程序(如 Exchange 2000 Server)可以访问 3 GB 的虚拟地址空间。

基于 Windows 2000 Datacenter Server 的计算机上的 Exchange 2000 Server
在基于 Windows 2000 Datacenter Server 的计算机上,当物理 RAM 超过 1 GB 时,请使用 /3GB 开关。Exchange 2000 Server 需要在 Windows 2000 Datacenter Server 上支持的 Service Pack 1 (SP1)。

/PAE 开关
物理地址扩展 (PAE) 是 Windows 2000 Datacenter Server 和 Windows 2000 Advanced Server 的一项功能,为此 API 编写的程序能够使用 4 GB 以上的内存。虽然有专门为利用此 API 而编写的程序,例如 Microsoft SQL Server 2000,但 Exchange 2000 Server 与其不兼容。因此,如果您使用 /3GB 开关,Exchange 2000 Server 只能对 3 GB 的地址空间进行寻址。
PS: 请留意上文中标蓝段落, M$ 只是将 Exchange 用来做例子,因为 Exchange 是 M$ 自己的产品。

PS: 版内有没有 PhotoShop 、CD 或其他需要频繁操作上百甚至上G文件的朋友? 有的话,请留意下面:

来至 kb.adobe.com , ID :332271
If you are running Windows XP Professional with Service Pack 2, you can set the 3 GB switch in the boot.ini file, which allows Photoshop to use up to 3 GB of RAM.


先检查主板是否支持,下载everest检测软件,在主板-内存一项中,Physical Address Extension(PAE)查看“操作系统支持”“处理器支持”是否为“是”,如果是“否”的话代表主板不支持,不要玩了,如果是“是”的话,“活动”一项是“否”也有可以修改的可能,
文章转自:http://www.cnblogs.com/jjkv3/archive/2008/11/14/1333448.html
回复 不支持

使用道具 举报

 楼主| 发表于 2011-7-22 13:54:53 | 显示全部楼层 来自 广东广州
本帖最后由 messenger 于 2011-7-22 14:02 编辑

ding
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-28 17:03 , Processed in 0.034971 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表