電腦內存不足,matlab處理不了80000*80000這樣的大矩陣,跪求解決辦法?
電腦內存不足,matlab處理不了80000*80000的矩陣,畢設就在這裡卡住了,大家知道啥解決辦法不,或者有木有一些網站是可以提供足夠空間運行代碼的?謝謝大家,辛苦大家了!!
你不說問題本身,就問這麼大個矩陣怎麼處理,那唯一答案就是買內存,還有什麼可問的。實際情況是基本上這種需求都可以通過演算法上的改變解決,比如sparse matrix,或者分塊矩陣,或者low rank,或者sampling。
1. 分塊解決;
2. sparse();
3. 增加虛擬內存或者swap空間(比如格了重裝);
4. 買AWS或者國內的阿里雲,跑octave。
當然我相信,如果你一定要用一台破電腦分解一個80000*80000的矩陣,而這個矩陣又不是稀疏的,也不能分塊,那你要重新反思一下你解決這個問題的方法了,硬算是不行的——這很可能是你畢業設計的價值所在。
你這個矩陣是Dense的嗎?還是稀疏的(只在很少的幾個元上有值)?
如果是稀疏矩陣,matlab應該有相關的包。或者用其他語言(C或Fortran)有稀疏矩陣的相關軟體包可以用(Umfpack,mumps,superlu)等都可以。
如果是Dense的(點點都有值),那可以看是否有低秩屬性(能轉化為若干小矩陣的乘積),可以參考Rank Revealing QR方法。
(參考文獻:Gu, Ming; Stanley C. Eisenstat (July 1996). "Efficient algorithms for computing a strong rank-revealing QR factorization" (PDF). SIAM Journal on Scientific Computing. 17 (4): 848–869理論部分可以跳過,直接看演算法就可以了。)別買內存了,用不到幾次,純屬浪費,還是直接租個雲吧。
增加點內存即可,內存又不貴。
矩陣一定要分塊。。
中間運行數據寫入硬碟。。存儲空間不夠就只能用時間換空間了。。你的問題應該是演算法方面的問題,嘗試優化一下。。如果矩陣元素都能原地操作就更好了。。最後,如果能跟導師說申請到超算的話就啥不用了。。分塊矩陣
不嫌時間長的話加大虛擬內存,矩陣能分塊就分塊,能弄成稀疏矩陣就弄成稀疏矩陣。
if(有錢) then買內存else if(矩陣稀疏) then改進演算法else 租雲計算
不用分塊,昨天我也遇到了和題主一樣的情況:昨天用MATLAB 讀取師兄的數據,大小有3G多使用csvread 命令直接進行讀取時,matlab提示 錯誤:內存不足後來從網上查到的解決方法 通過加大計算機的虛擬內存 可以解決MATLAB內存不足的問題。(我把虛擬內存提高到了16G)問題迎刃而解。希望對題主有所幫助。
支持@立黨 的解決方法,我再稍微補充一下。
從matlab出發,你可以嘗試調大虛擬內存的空間。從演算法角度,用分塊矩陣是個好方法。我之前用python有實現。https://github.com/JLU-WuYang/BlockMatrix用稀疏矩陣也挺好。不過這些方法都比不上加個內存條啊。1,如果條件允許,我建議你使用int 8或者int16模式~這樣矩陣佔用的內存更小
2,可以試試最新版matlab2016 的datastore大數據處理 可以看這位答主的文章
https://zhuanlan.zhihu.com/p/225203173可嘗試,用octave進行int8數據載入進行簡單的運算,降低矩陣維度,再裝回matlab進行計算(octave命令行載入更加省內存,存儲命令和matlab通用),這裡可以了解下我的專欄~https://zhuanlan.zhihu.com/p/24421946https://zhuanlan.zhihu.com/p/244636474,聽樓上加個內存試試((/≧▽≦)/~┴┴ )不過最近內存條有點貴啊你可以用Matlab Online/Mathworks cloud.
當然加點內存是最好的啦,當時老闆買server問我們要什麼配置,我就說內存越大越好。。。真的省很多碼code的時間。。
當然,很可能還是不夠的,那怎麼辦呢?有兩種解決辦法:
1. 通解,可以在絕大多數情況下使用。很多人都提到了,矩陣分塊存在硬碟上。用到哪塊取哪塊,舒服!
乘法的話 就直接分塊矩陣乘法
求逆的話 Schur complement 這裡可以找到分塊求逆的公式。
2. 特殊解決方式。首先,請仔細的問自己如下問題:
我真的需要這個矩陣存在內存里么?
如果你的實驗的對象其實沒有這麼大,那麼很可能這個矩陣本身就是某種計算的結果,比如kernel method的裡面的kernel matrix。這種情況下,很可能你可以在當且僅當你需要某個矩陣里元素的時候 去計算這個元素的數值。
舉個例子,我有個matrix , 大的我受不了。。
不過我其實可以比較快的計算 ,那麼在所有用到 的地方,我都可以把它重寫成關於 的式子,用完即扔,永不保存。。。
乘法什麼的都很簡單,求逆的話一般來說用 iterative method 針對 裡面的 解一下就好了,畢竟大部分時候其實只是需要 .
分塊矩陣,具體參考北大出版《高等代數》第四版
改演算法。
通常來說對於這種,一般都是有數學解決辦法,只是樓主沒發覺而已,稀疏矩陣啊svd啊很多辦法你都試了嗎?還是對這個大矩陣什麼都沒試就開始問了?或者我這種問,樓主知道svd是個啥東西么,不知道svd總知道qr分解吧嘿嘿嘿
分塊吧,畢竟腳本
裝高版本matlab試試
轉化成ijv格式,然後用sql來做矩陣乘法。比較適合sparse,dense的話也可以,但是效率會差些。好處是這樣的格式和語言是很多雲支持的。
推薦閱讀:
※對於廣大程序員來說,《演算法導論》不看數學證明只看其餘的部分合適嗎?
※為什麼鍵盤上的橫排數字鍵 0 在 9 的右邊,而不是在 1 的左邊?
※為什麼內存,顯卡等組合在一起,通電之後可以變成畫面呈現出來?一開始科學家是怎麼發現的?
※參加微軟校園Hackathon是怎樣的體驗?
※2016年你讀了哪些覺得比較好的計算機書籍?