星星和月亮 发表于 2009-7-26 17:47

请教关于matlab的memory的问题,谢谢啦

如果编程过程中一个变量的值太大了,out of memory了,该怎么办啊?例如,将一个数组的所有排列组合放入另一个变量中,但是程序运行时显示出错。out=

谢谢先啦~~~~~~~~~~~~~~~~~ {:5_369:}

江南织造 发表于 2009-7-26 17:53

本帖最后由 江南织造 于 2009-7-26 18:14 编辑

1.如果是java.lang.OutOfMemoryError
修改JAVA虚拟机的内存
请看这个
http://hi.baidu.com/zgyz/blog/item/fedb53f073cbfacb7831aaff.html

2.如果运行过程中OutOfMemory, 可增加虚拟内存

ElberEis 发表于 2009-7-27 08:57

干嘛一定要用ones呢? choicevec(i)+1 不就行了? 用ones不是白白占用内存么?
还有, 如果matirx比较稀疏的话, 建议直接上sparse matrix. 极端节省内存

星星和月亮 发表于 2009-7-27 12:45

1.如果是java.lang.OutOfMemoryError
修改JAVA虚拟机的内存
请看这个
http://hi.baidu.com/zgyz/blog/item/fedb53f073cbfacb7831aaff.html

2.如果运行过程中OutOfMemory, 可增加虚拟内存
江南织造 发表于 2009-7-26 17:53 http://www.dolc.de/forum/images/common/back.gif


谢谢啦,偶重新试了一下,用了3G switche,但是还是不行啊。报错说是: error using => vertcat   out of memory   

哎~~~~~~~~~~~~~~~~ {:4_284:}

星星和月亮 发表于 2009-7-27 12:49

干嘛一定要用ones呢? choicevec(i)+1 不就行了? 用ones不是白白占用内存么?
还有, 如果matirx比较稀疏的话, 建议直接上sparse matrix. 极端节省内存
ElberEis 发表于 2009-7-27 08:57 http://www.dolc.de/forum/images/common/back.gif


8好意思,能不能麻烦说详细点啊,偶是菜鸟,不是很懂啊~~~~~~~~~~~ {:4_302:}这个其实是报错信息里面的,说是 error using => vertcat out of memory   out= 偶实在是8太明白这个到底是什么意思。谢谢啦~~~~~~~~~~~ {:4_298:}

江南织造 发表于 2009-7-27 20:33




8好意思,能不能麻烦说详细点啊,偶是菜鸟,不是很懂啊~~~~~~~~~~~ {:4_302:}这个其实是报错信息里面的,说是 error using => vertcat out of memory   out=[out; choicevec(i)+ones(size(tempout,1),1) tem ...
星星和月亮 发表于 2009-7-27 12:49 http://www.dolc.de/forum/images/common/back.gif

你是想 choicevec(i) 每个数值都加一吧
直接 choicevec(i)+1, 和你这个choicevec(i)+ones(size(tempout,1),1)效果是等同的

星星和月亮 发表于 2009-7-27 23:17



你是想 choicevec(i) 每个数值都加一吧
直接 choicevec(i)+1, 和你这个choicevec(i)+ones(size(tempout,1),1)效果是等同的
江南织造 发表于 2009-7-27 20:33 http://www.dolc.de/forum/images/common/back.gif

我其实是有一串数组,然后求他们不同的组合排列,但是这个数组有29个元素,然后从中取12个进行排列组合,运行了很长很长很长时间以后就告诉我out of memory。然后我又尝试了3G开关,也不行啊~~~~~~~~~ 我原程序里面没有用过choicevec(i),我用的是combntns(t, a)。那个choicevec(i)是报错信息里面出来的,我也不明白是怎么回事啊~~~~~~~~~~ {:4_292:}

江南织造 发表于 2009-7-27 23:27



我其实是有一串数组,然后求他们不同的组合排列,但是这个数组有29个元素,然后从中取12个进行排列组合,运行了很长很长很长时间以后就告诉我out of memory。然后我又尝试了3G开关,也不行啊~~~~~~~~~ 我原程序里 ...
星星和月亮 发表于 2009-7-27 23:17 http://www.dolc.de/forum/images/common/back.gif

汗一个, 29取12的排列组合..............确实有点大{:5_371:}, 10的24还是23次方个数据{:4_297:}

星星和月亮 发表于 2009-7-28 01:09



汗一个, 29取12的排列组合..............确实有点大{:5_371:}, 10的24还是23次方个数据{:4_297:}
江南织造 发表于 2009-7-27 23:27 http://www.dolc.de/forum/images/common/back.gif


对啊,所以我到现在也没想出来怎么解决这个问题啊~~~~~~~~~~~~~~~~~~ {:4_284:}

ElberEis 发表于 2009-7-28 11:39

这样讨论没效率.
你把你的代码当中造成内存溢出的那一部分贴上来看看

ElberEis 发表于 2009-7-28 11:43

6# 江南织造

没错, 结果是一样的. 但是内存占用是不一样的. ones是要额外创建vector, 是占用内存的, 而加是遍历计算, 不占用内存的. 参见:

Using Memory Efficiently
Strategies for Efficient Use of Memory
第一条:
To conserve memory when creating variables, Avoid creating large temporary variables, and clear temporary variables when they are no longer needed.

ElberEis 发表于 2009-7-28 12:32

本帖最后由 ElberEis 于 2009-7-28 13:18 编辑

http://www.chinavib.com/space/63517/viewspace-16849.html

我试了一下nchoosek(a,k)和perms(), 还是内存出界

这个内存一个都省不了啊

星星和月亮 发表于 2009-7-28 21:10

这样讨论没效率.
你把你的代码当中造成内存溢出的那一部分贴上来看看
ElberEis 发表于 2009-7-28 11:39 http://www.dolc.de/forum/images/common/back.gif


for x=E:-1:1
   for y=1:length(G)
         if Tree_matrix(x,y)>0
               t=
         end
   end
end
pack;
Combination_matrix=combntns(t,E);

就是这段代码溢出了~~~~~~~~~~~~~~~ {:4_298:}能不能麻烦帮我看一下啊,谢谢啦~~~~~~~~ {:4_277:}

江南织造 发表于 2009-7-28 21:17




对啊,所以我到现在也没想出来怎么解决这个问题啊~~~~~~~~~~~~~~~~~~ {:4_284:}
星星和月亮 发表于 2009-7-28 01:09 http://www.dolc.de/forum/images/common/back.gif

10的18次方个矩阵元素需要7.2760e+006 TB 的内存, 这个星球上还没这么大的内存啊MM

具体参见

http://zhidao.baidu.com/question/54002163.html

星星和月亮 发表于 2009-7-28 21:59



10的18次方个矩阵元素需要7.2760e+006 TB 的内存, 这个星球上还没这么大的内存啊MM

具体参见

http://zhidao.baidu.com/question/54002163.html
江南织造 发表于 2009-7-28 21:17 http://www.dolc.de/forum/images/common/back.gif


哎~~~~~~~~~~~~~~~ 偶哭S啊~~~~~~~~~~~~~~~~· 难道要再换个算法?{:4_297:}

江南织造 发表于 2009-7-29 00:03




哎~~~~~~~~~~~~~~~ 偶哭S啊~~~~~~~~~~~~~~~~· 难道要再换个算法?{:4_297:}
星星和月亮 发表于 2009-7-28 21:59 http://www.dolc.de/forum/images/common/back.gif

嫩到底要干吗来着?{:5_389:}

星星和月亮 发表于 2009-7-29 02:24



嫩到底要干吗来着?{:5_389:}
江南织造 发表于 2009-7-29 00:03 http://www.dolc.de/forum/images/common/back.gif


求一个点到另外一个点的最短路径的数量~~~~~~~~~~~~~ {:4_277:}

ElberEis 发表于 2009-7-29 12:03

本帖最后由 ElberEis 于 2009-7-29 12:18 编辑

同意 江南织造

如果你在n个数当中选取m个数的排列组合, 排列组合的数目是:

n! / (n-m)!

现在n=29, m=12, 排列组合的数目是29!/(29-12)!, 每一个排列组合需要12个int的存储空间.

如果要存储所有的结果, 你至少需要 大约 29 8298 8307 8195 2000 byte 的内存

现在的主流硬盘大概是1TB, 大概是1.1e12 byte

所以不可能完全存储下来. 必须修改算法, 只能存储必要的内容, 随用随消

ElberEis 发表于 2009-7-29 12:08

什么叫做 "求一个点到另外一个点的最短路径的数量" ?

既然是最短路径, 怎么会有多个?

你能不能描述一下你的算法先?

星星和月亮 发表于 2009-7-29 15:24

什么叫做 "求一个点到另外一个点的最短路径的数量" ?

既然是最短路径, 怎么会有多个?

你能不能描述一下你的算法先?
ElberEis 发表于 2009-7-29 12:08 http://www.dolc.de/forum/images/common/back.gif




就好比这个图里面点1到点5的最短路径数量就是2个,即点1到点3到点5,点1到点4到点5。这些点和连接都用矩阵来表示,然后通过矩阵来求点与点之间最短路径的数量。这个图的矩阵就是:

江南织造 发表于 2009-7-29 22:57




2648868

就好比这个图里面点1到点5的最短路径数量就是2个,即点1到点3到点5,点1到点4到点5。这些点和连接都用矩阵来表示,然后通过矩阵来求点与点之间最短路径的数量。这个图的矩阵就是:[0 1 1 1 0; 1...
星星和月亮 发表于 2009-7-29 15:24 http://www.dolc.de/forum/images/common/back.gif

参考下dijkstra算法
看这个
http://www.mathworks.com/matlabcentral/fileexchange/20025

星星和月亮 发表于 2009-7-30 14:13



参考下dijkstra算法
看这个
http://www.mathworks.com/matlabcentral/fileexchange/20025
江南织造 发表于 2009-7-29 22:57 http://www.dolc.de/forum/images/common/back.gif


太感谢啦,偶研究下先~~~~~~~~~~~~~~~~ {:4_295:}

adsfgh 发表于 2009-9-9 15:40

if you cann't simplify your algorithm and the data accuracy are not the most important,
you can try to use the single data type to reduce your required memory at 50%.

Additional, the Matlab x64 is not limited at 3G Memory, you can take this version for your problem,

good luck
页: [1]
查看完整版本: 请教关于matlab的memory的问题,谢谢啦