VALSE

查看: 12381|回复: 5

MATLAB内存溢出的问题

[复制链接]

1

主题

2

帖子

29

积分

新手上路

Rank: 1

积分
29
发表于 2015-4-10 14:14:05 | 显示全部楼层 |阅读模式
本帖最后由 李清亮吉大 于 2015-4-10 14:21 编辑

图像检索中我在MATLAB R2012a用到vl_feat中的聚类算法。其中分层k-means聚类中[tree,A] = vl_hikmeans(data,K,nleaves) ;
data指图像库所有描述子信息。当我训练到10万幅图像时,data过大导致内存溢出。
我想咨询下各位大神。像这种情况都应该如何处理。


回复

使用道具 举报

发表于 2015-4-10 14:58:20 | 显示全部楼层
徐国智D华电 提供的回复:
http://blog.sina.com.cn/s/blog_8f6ca7d10100zys5.html

matlab内存溢出的解决方案 (2012-03-23 14:04:16)转载▼
标签: 杂谈       
转载自 albertleemon
最终编辑 albertleemon
matlab内存溢出的解决方案(整理)
1)增加虚拟内存的方法是不可行的
2)使用PACK:PACK可以将matlab中的变量导出到磁盘中,以增加可用内存
3)减少变量的内存开销
4)64位架构:采用64位的软硬件架构
5)3GB 切换(3GB switch):由于在windows上运行matlab时,如果内存的使用超过约1.7G左右就要出现这种错误,而无论你有多大的内存也没用。幸好现在 在Windows XP上,MATLAB现在支持3GB切换(3GB switch)启动选项(boot option),配置额外的1GB的可寻址内存到每个程序上。这增加了你可以储存到MATLAB workspace中资料的总量约到2.7 GB。这相当于33亿的精度值。此新增的内存区块和MATLAB使用剩下的(内存)并不是连续的,所以你不能建立一个数组来填满此空间。
6)更有效的优化方案调整Java虚拟机可分配的内存大小
matlab java.lang.OutOfMemoryError
Java虚拟机内存不够用了.可以增加最大内存设置.

1. 查找matlab根路径.在matlab命令行中敲入:matlabroot
显示根路径,如:C:\MATLAB7

2.查看当前Java虚拟机最大堆内存, 敲入:java.lang.Runtime.getRuntime.maxMemory

3.查看Java虚拟机版本.敲入:version -java

4.在 $MATLAB\bin\$ARCH 路径下新建java.opts文件.
$MATLAB是根路径,例如C:\MATLAB7
$ARCH是系统架构.例如win32,则在C:\MATLAB7\bin\win32下新建java.opts文件.

5.用记事本打开java.opts文件,
对于不同的版本的Java虚拟机,输入:
The following table shows the default settings MATLAB uses for versions of the JVM:

JVM       Initial Heap Size     Max Heap Size
1.6.0     -Xms64m               -Xmx128m (32-bit)
                                             -Xmx196m (64-bit)
1.5.0     -Xms64m               -Xmx96m   (32-bit)
                                             -Xmx128m (64-bit)
1.4.2     -Xms16m               -Xmx96m
1.3.1     -Xms16000000         -Xmx64000000
1.2.2     -Xms16000000         -Xmx64000000
1.1.8     -ms16000000           -mx64000000

例如我的Java是1.4.2,在java.opts文件写入-Xmx96m,保存就ok啦
如果输入错误就报错:warning : Failed to start to Java Virtual machine

6. 重启matlab,敲入java.lang.Runtime.getRuntime.maxMemory
显示最大内存改变,设置成功.
回复 支持 反对

使用道具 举报

发表于 2015-4-10 15:14:52 | 显示全部楼层
贾伟T中科院(365871530)  15:02:43
我的做法是,到阿里云上买个大内存的ECS服务器,比如16G内存的,一个月约750元左右。比较笨的办法。

方振鹏M计算所<fangzhenpeng@foxmail.com>  15:02:55
除非用自己的32位4GB机器跑,不然上述博客里的东西基本不会有太大帮助。上述博客,无非是增加Java虚拟机的启动内存,整理下磁盘,更换下架构能够访问整整3GB内存等方式。

在实验室环境下运行的程序,
先根据算法算内存。看看是否真的不够用,还只是程序写的不好。暂时不用的变量都可以先持久化,之后再读取。
若真的是内存不够用,
根据实验室的情况,要么在受限条件下寻找新解决方案,要么更换更好的程序运行环境。

【宗师】贾伟T中科院(365871530)  15:03:31
有道理
回复 支持 反对

使用道具 举报

1

主题

2

帖子

29

积分

新手上路

Rank: 1

积分
29
 楼主| 发表于 2015-4-10 15:30:59 | 显示全部楼层
十分感谢
回复

使用道具 举报

0

主题

1

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2015-5-28 13:35:13 | 显示全部楼层
两个思路:
1、如果是32位的pc,果断换64位,matlab_x64,物理内存不够就插内存条,如果有条件就用服务器
2、算法修改,采用硬盘<->内存的文件交换方式,看你用的是层级kmeans,算法不复杂,可以自己改写
相比之下,还是推荐采用第一个方法,这样自己能偷懒一些
回复 支持 反对

使用道具 举报

0

主题

1

帖子

100

积分

注册会员

Rank: 2

积分
100
发表于 2015-5-29 18:41:17 | 显示全部楼层
kmeans方法可以考虑分块来做。我就是弄的分块的方案,一次处理5000数据。
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Vision And Learning SEminar

GMT+8, 2024-11-23 17:42 , Processed in 0.019066 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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