[運算] 求助 想從改善程式碼解決out of memory

看板MATLAB作者 (榮)時間7年前 (2017/07/01 13:15), 7年前編輯推噓12(12025)
留言37則, 5人參與, 最新討論串1/1
大家好 小弟目前正在跑一個計算 流程大致上是這樣 先產生一個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 關於以上幾點問題希望各位指教 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.43.111.160 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1498886118.A.FA1.html ※ 編輯: ocf001497 (114.43.111.160), 07/01/2017 13:18:57

07/01 13:27, , 1F
把資料存硬碟,直接對硬碟做讀寫,你的ram放不下這麼大
07/01 13:27, 1F

07/01 13:27, , 2F
的資料,可惜這樣一定很慢
07/01 13:27, 2F
QQQ還是說只能求助大型電腦? ※ 編輯: ocf001497 (114.43.111.160), 07/01/2017 13:29:26 所以w大的意思是就算修改程式碼也沒辦法直接跑嗎? ※ 編輯: ocf001497 (114.43.111.160), 07/01/2017 13:32:23

07/01 13:43, , 3F
先學會怎麼估計一個矩陣所佔的記憶體大小吧
07/01 13:43, 3F

07/01 13:44, , 4F
首先每個矩陣元佔8 bytes,如果是複數還要再乘2
07/01 13:44, 4F

07/01 13:45, , 5F
所以一個10000*10000的矩陣就需要
07/01 13:45, 5F

07/01 13:46, , 6F
10000*10000*8 bytes = 8*10^8 bytes = 763MB
07/01 13:46, 6F

07/01 13:48, , 7F
70000的方陣就要36.5GB
07/01 13:48, 7F

07/01 14:15, , 8F
現在組一台128G的PC不是太困難的事情,但速度也是個問題
07/01 14:15, 8F

07/01 14:16, , 9F
解eigenvalue是n^3,你把解一萬的時間乘上343倍就是解七萬
07/01 14:16, 9F

07/01 14:17, , 10F
的時間,自己考量吧。一個比較合理的做法是只看前幾個
07/01 14:17, 10F

07/01 14:17, , 11F
會快很多。
07/01 14:17, 11F

07/01 14:22, , 12F
問題是那些point都要畫上去那個圖本身就很大了 除非畫好
07/01 14:22, 12F

07/01 14:22, , 13F
幾條線就存成點陣圖 然後新的點在畫上去 總之應該不可能
07/01 14:22, 13F

07/01 14:23, , 14F
所有線一次用for loop把他plot出來
07/01 14:23, 14F

07/01 14:31, , 15F
然後另外一個更重要的是 你幾萬條線在同一張圖上是要怎
07/01 14:31, 15F

07/01 14:31, , 16F
麼讓人看清楚啦...
07/01 14:31, 16F
哦哦不好意思忘記說,我想PLOT出來的東西就是要呈現 超多線全部疊在一起的連續感,因為有特殊的東西可以看 所以真的只能用大型電腦跑嗎 還是也無法QQ ※ 編輯: ocf001497 (114.43.111.160), 07/01/2017 14:36:54 還想請問一下存成點陣圖具體的做法是啥呢 謝謝!! ※ 編輯: ocf001497 (114.43.111.160), 07/01/2017 14:39:00

07/01 14:38, , 17F
那就照1F說的 分好幾組存起來 大概1400個row存一個檔?
07/01 14:38, 17F

07/01 14:39, , 18F
然後每次畫1400條線上去 畫好後存成點陣圖 之後再把新的
07/01 14:39, 18F

07/01 14:39, , 19F
1400條線畫到之前存的點陣圖上
07/01 14:39, 19F
感謝回覆! 但現在我有點卡住的地方是 因為我每次對角化出來的東西都是10000x1的column 如果要畫圖的話實際上是畫 [ [v_0] [v_0.01] ... [v_0.12] ]這種12個10000x1 column排在一起後的row 也就是說我沒辦法在做一次計算就存一個row 不知道這該怎麼解決呢 謝謝! ※ 編輯: ocf001497 (114.43.111.160), 07/01/2017 14:45:43

07/01 14:42, , 20F
用saveas存成.bmp或.png檔然後用imread讀吧
07/01 14:42, 20F

07/01 14:44, , 21F
plot 1400條線=>saveas成.bmp=>清除內存=>imread剛剛的
07/01 14:44, 21F

07/01 14:45, , 22F
.bmp=>plot新的1400條線=>saveas新的.bmp覆蓋過去.....
07/01 14:45, 22F
另外out of memory我想說是不是因為那個要解的矩陣太大 而不是因為最後那個[ [v_0] [v_0.01] ... [v_0.12] ]太大 因為這個比要解的10000x10000的矩陣小很多 謝謝 ※ 編輯: ocf001497 (114.43.111.160), 07/01/2017 14:49:12

07/01 14:50, , 23F
所以要存到硬碟阿 每次解出一組v 然後這些v每1400個就存
07/01 14:50, 23F

07/01 14:50, , 24F
一個檔 然後算出新的v 再每1400個元素存起來到剛剛那些
07/01 14:50, 24F

07/01 14:50, , 25F
檔案中
07/01 14:50, 25F

07/01 14:52, , 26F
喔對耶 我忘記你要解eigen的矩陣本身就70000*70000了...
07/01 14:52, 26F
哦哦! 感謝! 大概知道概念了 但想請問一下如果是70000x70000是不是連寫出這個矩陣都有問題... ※ 編輯: ocf001497 (114.43.111.160), 07/01/2017 14:55:34

07/01 14:56, , 27F
是阿...除非你的70000*70000矩陣式很多零的矩陣可以用
07/01 14:56, 27F

07/01 14:57, , 28F
sparse矩陣可能還有辦法
07/01 14:57, 28F

07/01 14:57, , 29F
如果是general的矩陣可能就無法了
07/01 14:57, 29F
哦哦! 我的矩陣應該蠻多零的! 所以可以用一樣的方式 只是我把矩陣建起來的時候不用正常的矩陣 用sparse就可以嗎 謝謝 ※ 編輯: ocf001497 (114.43.111.160), 07/01/2017 15:02:12

07/01 15:01, , 30F
https://goo.gl/sa1wzv 可能可以試試看virtual memory吧
07/01 15:01, 30F

07/01 15:01, , 31F
但這個我自己沒試過就是了 原理大致上好像是拿硬碟當ram
07/01 15:01, 31F

07/01 15:02, , 32F
來用?不是很熟
07/01 15:02, 32F

07/01 15:11, , 33F
喔可以用sparse那就用sparse吧
07/01 15:11, 33F
好! 我來試試 感謝 ※ 編輯: ocf001497 (49.214.16.125), 07/01/2017 15:25:06

07/01 17:11, , 34F
用sparse要確定0夠多 不然會更慢 以前有問過這問題
07/01 17:11, 34F

07/01 17:11, , 35F
應該說不會更有效率
07/01 17:11, 35F

07/03 17:29, , 36F
plot很吃記憶體,寫迴圈有作圖的話作完要把handle關掉
07/03 17:29, 36F

07/03 17:34, , 37F
我都用export_fig取代saveas存圖
07/03 17:34, 37F
文章代碼(AID): #1PLo_c-X (MATLAB)
文章代碼(AID): #1PLo_c-X (MATLAB)