電腦內存不足,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/22520317

3可嘗試,用octave進行int8數據載入進行簡單的運算,降低矩陣維度,再裝回matlab進行計算(octave命令行載入更加省內存,存儲命令和matlab通用),這裡可以了解下我的專欄~

https://zhuanlan.zhihu.com/p/24421946

https://zhuanlan.zhihu.com/p/24463647

4,聽樓上加個內存試試((/≧▽≦)/~┴┴ )不過最近內存條有點貴啊


你可以用Matlab Online/Mathworks cloud.


當然加點內存是最好的啦,當時老闆買server問我們要什麼配置,我就說內存越大越好。。。真的省很多碼code的時間。。

當然,很可能還是不夠的,那怎麼辦呢?有兩種解決辦法:

1. 通解,可以在絕大多數情況下使用。很多人都提到了,矩陣分塊存在硬碟上。用到哪塊取哪塊,舒服!

乘法的話 就直接分塊矩陣乘法

求逆的話 Schur complement 這裡可以找到分塊求逆的公式。

2. 特殊解決方式。首先,請仔細的問自己如下問題:

我真的需要這個矩陣存在內存里么?

如果你的實驗的對象其實沒有這麼大,那麼很可能這個矩陣本身就是某種計算的結果,比如kernel method的裡面的kernel matrix。這種情況下,很可能你可以在當且僅當你需要某個矩陣里元素的時候 去計算這個元素的數值。

舉個例子,我有個matrix M in mathbb{R}^{N	imes N} , N 大的我受不了。。

不過我其實可以比較快的計算M_{i,j} ,那麼在所有用到M 的地方,我都可以把它重寫成關於M_{i,j} 的式子,用完即扔,永不保存。。。

乘法什麼的都很簡單,求逆的話一般來說用 iterative method 針對 Mx=y 裡面的y 解一下就好了,畢竟大部分時候其實只是需要x= M^{-1}y .


分塊矩陣,具體參考北大出版《高等代數》第四版


改演算法。


通常來說對於這種,一般都是有數學解決辦法,只是樓主沒發覺而已,稀疏矩陣啊svd啊很多辦法你都試了嗎?還是對這個大矩陣什麼都沒試就開始問了?或者我這種問,樓主知道svd是個啥東西么,不知道svd總知道qr分解吧嘿嘿嘿


分塊吧,畢竟腳本


裝高版本matlab試試


轉化成ijv格式,然後用sql來做矩陣乘法。比較適合sparse,dense的話也可以,但是效率會差些。好處是這樣的格式和語言是很多雲支持的。


推薦閱讀:

對於廣大程序員來說,《演算法導論》不看數學證明只看其餘的部分合適嗎?
為什麼鍵盤上的橫排數字鍵 0 在 9 的右邊,而不是在 1 的左邊?
為什麼內存,顯卡等組合在一起,通電之後可以變成畫面呈現出來?一開始科學家是怎麼發現的?
參加微軟校園Hackathon是怎樣的體驗?
2016年你讀了哪些覺得比較好的計算機書籍?

TAG:計算機 | MATLAB | 代碼 | 內存RAM |