關於out of memory,有一些可行的辦法,主要包括以下幾點。

第一,清除臨時變數。對於不再需要的臨時變數,要及時清除掉,釋放內存。

第二,預分配內存。對於佔用大內存的變數,預先為其分配內存,能夠有效避免內存碎片化導致的out of memory。

第三,使用稀疏變數。對於有大量0的稀疏矩陣來說,稀疏變數佔用內存更小。

第四,pack命令。pack命令能夠整理內存,將碎片化的內存整合起來。

第五,嘗試使用較低精度的運算,比如將double類型改為single。如果可能,可以使用整數類型如int16之類的進行運算。

第六,增大虛擬內存。增大虛擬內存能夠一定程度上彌補物理內存不足的缺點。

第七,僅載入需要的內存。對於大型數據集,可以不用一次性全部載入內存,參考datastore mapReduce等函數的使用。

易夕:MATLAB: 如何用Mapreduce實現100GB數據的去重並排序??

zhuanlan.zhihu.com圖標

第八,使用tall數組。一些函數支持對tall的運算,tall數組能夠處理無法放入內存的數據。

第九,使用多臺計算機的內存。通過創建計算機集羣能夠利用集羣內所有內存進行計算。

易夕:MATLAB分散式運算:本地計算機集羣配置指南?

zhuanlan.zhihu.com圖標

第十,升級硬體。軟體不夠,硬體來湊。

易夕:如何配置一臺適合跑MATLAB的電腦?

zhuanlan.zhihu.com圖標


矩陣求逆運算量是很大的,大規模的矩陣求逆是可能出現內存不足的。


看看128g是內存容量還是硬碟儲存容量

要是128g的內存的話,那就是軟體和程序的問題了。

要是128g的硬碟儲存的話,,,內存容量就難說了。。。

像matlab R2019b平時計算運行所佔內存就1G


下個cvx,把求逆的過程做成一個解凸優化的模型


MATLAB裏矩陣求逆是很容易出現內存不足的。

基本上10000x10000以上的矩陣求逆我都不會考慮在MATLAB直接用pinv()或者 『』去做了(考慮到我接觸的大部分問題都是病態欠定問題,這裡不考慮inv()的情況)

大矩陣求逆最好還是從演算法上做出改進來入手吧,有很多matrix inversion identity可以看一看是否有用,另外一些large scale SVD的演算法也可以看一看,有時候會有用


可以試試降低精度,比如說用float16


推薦閱讀:
相關文章