数学建模社区-数学中国

标题: 与大稀疏矩阵的计算有关的内存错误问题 [打印本页]

作者: ℡oメ心情浪子o    时间: 2013-10-1 20:02
标题: 与大稀疏矩阵的计算有关的内存错误问题
    从文件导入数据建立一个大于10000*5000的稀疏矩阵,然后用corrcoef()计算相关系数时,刚开始就不能跑起来,直接显示 out of memort,后来通过开启3G模式之后可以跑起来,但是跑了大概40分分钟之后显示相同的错误,错误信息如下:) r. @# g- W" g- a
aaa=corrcoef(B)
6 A- {5 N5 W" N7 p9 ^7 X9 J& GError using  ./
0 ?2 d2 h( Z" I. _* Q: [Out of memory. Type HELP MEMORY for your options.8 w: c( r8 A9 ]
% E+ Q! s" ?6 @  @+ v6 U! q, }
" a8 {0 F& f7 C# g
Error in cov (line 97): Z" c* L3 W' q8 P( Q
    xy = (xc' * xc) / (m-1);6 r& S% F0 j0 K: B- J

; e, k( C0 _. K9 d& s% A$ p, b. ~
) k; M& a+ S3 w  q6 h
Error in corrcoef>correl (line 209)
! [$ Y4 j9 J3 k2 o" r/ ~r = cov(x);
4 a; V! O- D/ E; b& ~4 V0 K0 m- F! {6 \  ]( M

$ X) d$ b. h2 ~2 W, \Error in corrcoef (line 92)' R4 }. ~0 H' a! t% l( f
   r = correl(x);, I4 |2 n- J4 s9 `/ k- G
怎么破,求大神!/ t8 g5 t. x' q1 {# E

作者: madio    时间: 2013-10-3 18:15
这个问题我觉得既然3G模式可以跑起来,说明这个矩阵可以放进去了,但是跑了一段时间出现内存不足,说明中间变量过多了,我建议你不要用这个函数来求相关系数矩阵,毕竟这个相关系数矩阵数学上的算法很明确,你编一个循环程序来计算,每次只调用两个向量,用完了这个空间就被下一组向量占用,这样会省很大的空间。不要只依赖函数
作者: madio    时间: 2013-10-3 18:16
转一篇别人写的过于内存溢出问题的文章,里面介绍了一些基本的方法。
$ t- m2 T1 [  a- l5 hMATLAB程序碰到OUT OF MEMORY的问题
matlab程序碰到out of memory的问题真是让人崩溃的一件事情,程序是别人的,不能做大的改动,只能想办法增加内存。别人总结的可用的方法有:
1. 增加虚拟内存:右击我的电脑—属性--高级--性能设置--高级--虚拟内存更改,按自己电脑的硬盘在自定义大小里设置数字,然后再按设置-确定,然后重启。否则更改无效。
对XP,我发现即使增大虚拟内存到4G, matlab可用虚拟内存仍只有2G。仍然out of memory." v4 ]2 ~8 t: t; ^3 y& ]; U
>> feature('memstats')$ k9 j8 n- D0 E$ K, Y" i2 \! z
Physical Memory (RAM):8 M% |0 j8 H6 j8 R* `$ F  K
In Use:                              611 MB (26364000)8 ]/ V2 i9 v7 n1 n, ?) N: B# Z( T
Free:                               1428 MB (59418000)8 H  E, p' Q  \# A4 G+ d# w
Total:                              2039 MB (7f77c000)$ @( Y+ u0 z) D2 c3 Y$ c0 ~
Page File (Swap space):
8 g. W. c% k2 eIn Use:                              470 MB (1d628000)6 C8 B( @4 ^- \9 @1 F
Free:                               4481 MB (118156000)
) |+ ~3 ^5 m6 |& W: \1 O" I7 o! oTotal:                              4951 MB (13577e000)
) e6 X. Z0 J5 s* h) I! w7 D* K7 iVirtual Memory (Address Space):& c# d" o1 e  Q0 U; e1 |
In Use:                              400 MB (190d3000)# P% x! ]7 m) V/ r
Free:                               1647 MB (66f0d000)
4 ?- v. v6 W7 ]0 u$ l" sTotal:                              2047 MB (7ffe0000)9 c& @) y  G' _# v* m! f) K" ~
Largest Contiguous Free Blocks:
# G1 u4 d+ y2 ?& i% d1. [at 20017000]                    675 MB (2a3f9000)% T5 J9 E8 N# o+ }8 j  x, G
2. [at 4b033000]                    253 MB ( fd8d000)$ A! z9 x* U; }
3. [at 18010000]                    127 MB ( 7ff0000)
, J1 }5 l+ ]' F4. [at 68ff7000]                     64 MB ( 4009000)
; K4 {5 k8 t/ c+ K5. [at 6d7c5000]                     56 MB ( 389b000)
, ~8 A. @1 P& ]* U6. [at 62c29000]                     50 MB ( 3207000)
0 H$ s; z: \9 C' t7. [at  d330000]                     44 MB ( 2ca0000)/ w- r4 G* N0 t0 ?
8. [at 663dd000]                     41 MB ( 2983000)
. E6 c+ Y1 E) v* I9. [at 60809000]                     36 MB ( 2417000)
/ I5 F8 H: ]( c) i$ {1 o10. [at 5adf7000]                     35 MB ( 2379000)8 Q! {2 `* x9 u, o
======= ==========4 K) R% N0 ]3 k8 t; G
1385 MB (569d4000)
对Vista系统,可能是因为我在第四步设置了命令3GB switche:可用最大虚拟内存是3G
>> feature('memstats')! D% N5 P7 s  j% Y
& ^# C$ a" Z2 e% Z8 @, ]2 _
Physical Memory (RAM):6 ~6 b! x  D- n7 T6 h
In Use:                             1082 MB (43a3a000)
! W3 g, @" V; g. s! ], EFree:                               1467 MB (5bb96000). X+ L+ X( Y0 o: Z9 v5 w
Total:                              2549 MB (9f5d0000)2 Z4 S( T8 b6 |( b0 d1 Y/ v) J% f! e4 L
Page File (Swap space):6 ~& X- O2 |) k6 C" [/ }
In Use:                             1227 MB (4cbe3000)
. c/ @5 Q& f1 X( h1 C$ @: OFree:                               5315 MB (14c36e000)" U/ [0 {* z8 L& i( D
Total:                              6543 MB (198f51000)
5 _; A& u0 S) c9 z- V' {Virtual Memory (Address Space):
9 z/ o2 v5 X. `( p# fIn Use:                              501 MB (1f5bf000)
+ O2 D. g7 h: tFree:                               2570 MB (a0a21000)% z5 w! Q/ Y. B( k, G( z
Total:                              3071 MB (bffe0000)
1 D5 R" c8 Z5 q# {$ SLargest Contiguous Free Blocks:: }1 [+ r- O. _8 j4 ^
1. [at 1b010000]                   1074 MB (432d0000)
# E0 W) s0 p( X2. [at 7fff0000]                   1023 MB (3ff9c000)
7 H' |( x; @! S: F0 W) _& K, j3. [at 5e302000]                    227 MB ( e32e000)6 R5 X  P# D4 Z; A
4. [at 7c41b000]                     50 MB ( 32d5000)/ s/ C: g; P! e$ Z6 g- [/ b/ r* M" k( s
5. [at 6d857000]                     30 MB ( 1e09000)9 |1 f  I3 R7 \1 D1 {
6. [at 6f66b000]                     21 MB ( 1595000)
! a9 g, O. q, R7 k% E2 j9 y7. [at 715c3000]                     20 MB ( 149d000)7 _5 a* l; ^6 a: I: g7 F) e
8. [at 7a038000]                     18 MB ( 12f8000)
* Q1 a1 T' t  n) ?# j8 ]% s9. [at 739a6000]                     17 MB ( 114a000)
! k8 Y2 K0 W6 o. t0 j9 Q10. [at 70c41000]                      9 MB (  94f000)5 [# L* r$ Z- Z2 M7 U7 W0 P8 g
======= ==========" R! C# `2 N+ ^5 ~) z6 ^
2494 MB (9be3b000)
2. 采用PACK: 试了不管用
0 ~/ _  B. f) R# Z0 \" A
3. 条件允许的话采用64位系统:32位免谈
, J# y  N. @. A: m8 k
4. 采用3GB switch: 由于32位 Windows 操作系统的限制,每个进程只能使用最多 2GB 的虚拟内存地址空间,因此 Matlab 的可分配内存也受到相应的限制。Matlab 7.0.1 引进了新的内存管理机制,可以利用 Windows 的 3GB 开关,使用 3GB 开关启动的 Windows 每个进程可以在多分配 1 GB 的虚拟地址空间。我的笔记本是vista系统,台式机是XP系统。
1)对vista系统:Bcdedit 位于X:\Windows\system32\ "X:"为安装Vista的盘符,利用Bcdedit命令,可以自定义你的Vista启动管理项。使用命令: BCDEdit /set increaseuserva 3072 ,DOS界面显示操作成功,注意虚拟内存应设成大于3G,否则内存分配<3G。可在matlab里使用 system_dependent memstats或feature('memstats')命令查询。
2)对XP:右键单击我的电脑--->>属性--->>高级--->>启动和故障修复--->>设置--->>编辑--->>将最后一行multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" 复制,在下一行粘贴,并将粘贴一行改为: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional with 3GB switche" /3gb --->>存储--->>确定--->>重新启动计算机--->>在显示选择操作系统时,选择带有 3GB switche的一项--->>打开matlab。可是我设置完重启计算机,选择3GB switche的一项时,显示lsass.exe 应用程序错误,无法登陆!看来我的XP系统不支持3GB switche模式登录,因此matlab的可用虚拟内存不会超过2G。

6 \( E6 ^- M2 A+ G/ y  d+ Y* U0 q5. 优化程序,减少变量
& B* j! p# w, k7 _  u
6. 如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动

* z( C" c! Y9 h& h7. 关闭Matlab Server

/ r* y, ~( |7 Q! Q
5 ?; L" A3 A* ^; l8 X

- a3 A! h9 {4 Q
: L  }" B  \* X, b2 N- K
作者: ℡oメ心情浪子o    时间: 2013-10-7 16:12
madio 发表于 2013-10-3 18:16
* J7 c0 V$ j; I转一篇别人写的过于内存溢出问题的文章,里面介绍了一些基本的方法。
' l2 d& z* w% C8 l5 l7 ^( xMATLAB程序碰到OUT OF MEMORY的问题m ...
% o- ~$ g1 Z$ i- S7 t4 P0 n
十分谢谢。。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5