[运算] 求助 想从改善程式码解决out of memory

楼主: ocf001497 (荣)   2017-07-01 13:15:15
大家好
小弟目前正在跑一个计算
流程大致上是这样
先产生一个empty matrix
用for循环跑不同的参数 ex. for x = 0 : 0.01 : 0.12
每次都解一个大型矩阵
大概10000x10000
每次会解出10000个eigenvalue
接着把这个10000个eigenvalue用column方式储存到empty matrix中
所以跑完之后那个empty矩阵就会变成
[[v_0] [v_0.01] [v_0.02] ... [v_0.12] ]
每个v都代表一个 10000x1 的column
接下来再把这个矩阵的"每一个row"依次对x = 0 : 0.01 : 0.12 作图
所以会画出10000条线
原本10000x10000的case我的电脑还是可以跑
但再变大几倍后就会出现out of memory
我想了几种解决方法,但不清楚怎么执行,请各位大大帮帮我
(1)
我想说out of memory应该是因为最后那个empty matrix会变超大
所以想说能不能自行产生10000个empty matrix
每次解完一次10000x10000矩阵的eigenvalue后 把column中每个元素依次存在
那10000个empty matrix中
这样的话最后就会有10000个矩阵
但是每个矩阵都是小小的row (ex. 0:0.01:0.12 大概才1*13的 row array而已)
我希望程式码大概长这样
for i = 1 : 1 : 10000 ;
造出"名字是 Ai "的empty matrix ; ←这边不会用orz
end
for x = 参数 ;
解10000x10000的矩阵
解出10000x1的eigenvalue column vector(假设叫他v)
把每个元素依次存在对应的Ai empty matrix中
for j = 1 : 1 : 10000 ;
Aj = [Aj v(j)] ; ←这边不会用orz
end
end
不知道这样把矩阵拆成10000个小矩阵的方法能不能解决
(2)
研究室好像有大型电脑 但我的project以理论推导为主 几乎没碰过
如果用大型电脑帮我跑的话 能不能用我最一开始的流程呢?
就是直接存一个超大容量的矩阵 再一次对个别row作图
我是希望最后最上面那个流程可以处理70000x70000的矩阵
不知道大型电脑有没有办法解决out of memory的问题
小弟仍在学习matlab
关于以上几点问题希望各位指教
谢谢
作者: worcdlo (worcdlo)   2017-07-01 13:27:00
把资料存硬盘,直接对硬盘做读写,你的ram放不下这么大的资料,可惜这样一定很慢
作者: sunev (Veritas)   2017-07-01 13:43:00
先学会怎么估计一个矩阵所占的内存大小吧首先每个矩阵元占8 bytes,如果是复数还要再乘2所以一个10000*10000的矩阵就需要10000*10000*8 bytes = 8*10^8 bytes = 763MB70000的方阵就要36.5GB现在组一台128G的PC不是太困难的事情,但速度也是个问题解eigenvalue是n^3,你把解一万的时间乘上343倍就是解七万的时间,自己考量吧。一个比较合理的做法是只看前几个会快很多。
作者: profyang (prof)   2017-07-01 14:22:00
问题是那些point都要画上去那个图本身就很大了 除非画好几条线就存成位图 然后新的点在画上去 总之应该不可能所有线一次用for loop把他plot出来然后另外一个更重要的是 你几万条线在同一张图上是要怎么让人看清楚啦...那就照1F说的 分好几组存起来 大概1400个row存一个档?然后每次画1400条线上去 画好后存成位图 之后再把新的1400条线画到之前存的位图上用saveas存成.bmp或.png档然后用imread读吧plot 1400条线=>saveas成.bmp=>清除内存=>imread刚刚的.bmp=>plot新的1400条线=>saveas新的.bmp覆蓋过去.....所以要存到硬盘阿 每次解出一组v 然后这些v每1400个就存一个档 然后算出新的v 再每1400个元素存起来到刚刚那些档案中喔对耶 我忘记你要解eigen的矩阵本身就70000*70000了...是阿...除非你的70000*70000矩阵式很多零的矩阵可以用sparse矩阵可能还有办法如果是general的矩阵可能就无法了https://goo.gl/sa1wzv 可能可以试试看virtual memory吧但这个我自己没试过就是了 原理大致上好像是拿硬盘当ram来用?不是很熟喔可以用sparse那就用sparse吧
作者: LiamIssac (Madchester)   2017-07-01 17:11:00
用sparse要确定0够多 不然会更慢 以前有问过这问题应该说不会更有效率
作者: imafsb (匿名)   2017-07-03 17:29:00
plot很吃内存,写循环有作图的话作完要把handle关掉我都用export_fig取代saveas存图

Links booklink

Contact Us: admin [ a t ] ucptt.com