数学建模社区-数学中国

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

作者: ℡oメ心情浪子o    时间: 2013-10-1 20:02
标题: 与大稀疏矩阵的计算有关的内存错误问题
    从文件导入数据建立一个大于10000*5000的稀疏矩阵,然后用corrcoef()计算相关系数时,刚开始就不能跑起来,直接显示 out of memort,后来通过开启3G模式之后可以跑起来,但是跑了大概40分分钟之后显示相同的错误,错误信息如下:
4 ]5 s3 j" G  h  R+ J4 ^aaa=corrcoef(B)
" z5 G5 I1 T. M0 ?3 rError using  ./ , z1 u9 B7 x! |8 j
Out of memory. Type HELP MEMORY for your options.
8 ^4 w# w6 V, ?" ?
5 X( ~& {2 @. k5 S
/ v% K4 t# q* b: a. `
Error in cov (line 97)' i) z, }2 P# I% n
    xy = (xc' * xc) / (m-1);
* m' s* ^5 O8 A5 [' [  s& ~) L" u+ f8 L. i8 X7 y) v5 t& ?
, y5 g6 {6 i" U  @7 V- j5 v
Error in corrcoef>correl (line 209)+ S* h/ t8 M0 R' s
r = cov(x);4 S5 }; z9 w' K$ P

; y8 c- b3 I% z1 V" l* j9 C% q+ R0 Z7 W
; F7 u  P( Z3 N3 Q
Error in corrcoef (line 92)
1 N# @- B* \* }, i; f* G# Z2 M   r = correl(x);
& U# N5 V( A1 a) f2 D5 x6 r怎么破,求大神!( f+ u1 q0 _% ~/ h; x

作者: madio    时间: 2013-10-3 18:15
这个问题我觉得既然3G模式可以跑起来,说明这个矩阵可以放进去了,但是跑了一段时间出现内存不足,说明中间变量过多了,我建议你不要用这个函数来求相关系数矩阵,毕竟这个相关系数矩阵数学上的算法很明确,你编一个循环程序来计算,每次只调用两个向量,用完了这个空间就被下一组向量占用,这样会省很大的空间。不要只依赖函数
作者: madio    时间: 2013-10-3 18:16
转一篇别人写的过于内存溢出问题的文章,里面介绍了一些基本的方法。9 ^; b) T1 l" W, Y- W" D0 _
MATLAB程序碰到OUT OF MEMORY的问题
matlab程序碰到out of memory的问题真是让人崩溃的一件事情,程序是别人的,不能做大的改动,只能想办法增加内存。别人总结的可用的方法有:
1. 增加虚拟内存:右击我的电脑—属性--高级--性能设置--高级--虚拟内存更改,按自己电脑的硬盘在自定义大小里设置数字,然后再按设置-确定,然后重启。否则更改无效。
对XP,我发现即使增大虚拟内存到4G, matlab可用虚拟内存仍只有2G。仍然out of memory.
6 o0 w" ^! I* V
>> feature('memstats')5 |$ X& @# B4 o* x: i
Physical Memory (RAM):
2 Z3 Y9 p6 H8 C, h$ uIn Use:                              611 MB (26364000)
  ?% v$ B  }7 {- {0 L7 yFree:                               1428 MB (59418000)
8 |) e7 j# Q7 M( D9 S/ ^2 S- MTotal:                              2039 MB (7f77c000)
( n' G$ S3 B' e& U. o6 y2 \- iPage File (Swap space):
3 A  m) q: [0 t, j# z. FIn Use:                              470 MB (1d628000)
7 _4 k4 u8 J+ o# oFree:                               4481 MB (118156000); R+ r: b( i. Y
Total:                              4951 MB (13577e000)9 J8 }+ b6 x$ j4 U; f
Virtual Memory (Address Space):
4 o) A/ z! s: \/ a: f6 G; e) Q) qIn Use:                              400 MB (190d3000)
; [- W& |$ ^; ]9 Q/ hFree:                               1647 MB (66f0d000)/ ?2 z% D6 Q2 [9 Q' C! y
Total:                              2047 MB (7ffe0000)2 m* S% z( ?4 F& c: M! X! i
Largest Contiguous Free Blocks:
! `% V) U  J5 n7 d, l1. [at 20017000]                    675 MB (2a3f9000)9 n, J8 H6 w8 c4 [  m% I8 X
2. [at 4b033000]                    253 MB ( fd8d000)
9 U' r8 J; b! o4 x/ E  t3. [at 18010000]                    127 MB ( 7ff0000)# s+ @( X! x0 m$ A6 j. Y
4. [at 68ff7000]                     64 MB ( 4009000)6 g! j2 `# A- K8 M! {2 m. U
5. [at 6d7c5000]                     56 MB ( 389b000)$ R/ l1 d4 X; ~6 d
6. [at 62c29000]                     50 MB ( 3207000)5 \4 {+ g- g0 ]* h8 r& e! R
7. [at  d330000]                     44 MB ( 2ca0000)
8 Z1 a5 z( J3 r7 ]8. [at 663dd000]                     41 MB ( 2983000)
- s$ l2 `" M9 E7 |9. [at 60809000]                     36 MB ( 2417000)
3 L1 e7 L7 t, l$ ~' }10. [at 5adf7000]                     35 MB ( 2379000)$ F* i, d0 ^6 @, c8 a
======= ==========
" ]/ @3 @4 u9 S3 u! V* I! y( L1385 MB (569d4000)
对Vista系统,可能是因为我在第四步设置了命令3GB switche:可用最大虚拟内存是3G
>> feature('memstats')1 x5 i# H6 g7 J9 a

* P3 o7 ^; Y" _, {4 G1 vPhysical Memory (RAM):) u' t2 D. M: a$ ]# K* Z
In Use:                             1082 MB (43a3a000)
* ^( ?& \# M; ?3 f8 RFree:                               1467 MB (5bb96000)8 G6 X# ]  q* F1 G2 G
Total:                              2549 MB (9f5d0000)
/ E: _8 B) b. ^1 z6 p6 GPage File (Swap space):$ H5 }. \% B, \9 e- L' M
In Use:                             1227 MB (4cbe3000)& r! T0 ]% L2 p$ @/ O# f, R
Free:                               5315 MB (14c36e000)
. E3 ^) p8 y& o, H5 aTotal:                              6543 MB (198f51000)- ~' e% ^5 K7 ~- w: _/ Z
Virtual Memory (Address Space):
- |8 J% w) E4 i/ _* PIn Use:                              501 MB (1f5bf000)7 D, n( l% b. b3 P+ J
Free:                               2570 MB (a0a21000)
( }- I. W" ]: M3 q. M' q: jTotal:                              3071 MB (bffe0000). t# v5 G2 k. S
Largest Contiguous Free Blocks:$ p- }* c/ J) w9 S7 v! e" D1 h% P+ \
1. [at 1b010000]                   1074 MB (432d0000)
) G6 l7 q- b0 M4 G2. [at 7fff0000]                   1023 MB (3ff9c000)2 H9 {$ l- ^: z( }
3. [at 5e302000]                    227 MB ( e32e000)
3 Q2 @, p) z: J  g4. [at 7c41b000]                     50 MB ( 32d5000)
0 j( B8 G+ K4 i) {% Z6 m3 X5. [at 6d857000]                     30 MB ( 1e09000)
+ b, N, V8 Y% T7 S* `6. [at 6f66b000]                     21 MB ( 1595000)
0 ?/ _: V/ q( f! h7. [at 715c3000]                     20 MB ( 149d000); y  s: ]' l8 \( B: n5 J
8. [at 7a038000]                     18 MB ( 12f8000)
# K% x; U8 r2 l2 A+ F$ V/ r9. [at 739a6000]                     17 MB ( 114a000)
& I- e' }; c; ~; K2 l0 j10. [at 70c41000]                      9 MB (  94f000)( N' @# D. e6 T; U
======= ==========+ j" N% x, c" M/ }- u; ?5 ~
2494 MB (9be3b000)
2. 采用PACK: 试了不管用

* ~  d' f5 [* T0 W3. 条件允许的话采用64位系统:32位免谈
$ O+ x! j( A, o& D7 d9 j7 z
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。

" A7 x8 v$ w+ N6 T7 n& W5. 优化程序,减少变量
6 |' ~5 ]. L* ^8 s* U
6. 如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动
; U- K8 y+ w! o0 M$ d5 a
7. 关闭Matlab Server
: ^, ~: q, O; Q) L) R0 d' [
  ^9 |# z8 x! j+ L) y) I7 h
. E9 k7 X, D9 C8 X8 y1 }3 `' |8 r* x
, [* C9 Z* U+ d  [; ?2 `. G

作者: ℡oメ心情浪子o    时间: 2013-10-7 16:12
madio 发表于 2013-10-3 18:16
  A' f8 s, ]7 n7 W' @转一篇别人写的过于内存溢出问题的文章,里面介绍了一些基本的方法。
9 g# m) ^9 s9 J6 w1 iMATLAB程序碰到OUT OF MEMORY的问题m ...

9 m7 ]6 P  w+ D! [# Z十分谢谢。。




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