[運算] 求助 想從改善程式碼解決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