2015-04-17 18 views
0

在調試模式下,我停在某個斷點處並執行一些矩陣操作來測試程序。這些操作在計算上很昂貴,所以MATLAB在我的linux系統上使用交換空間。然後,繼續運行程序後,交換空間幾乎已滿,所以MATLAB會壓碎。有沒有一種方法可以在調試節點上清除交換?做clear allclear classes只對RAM內存有效,但不影響交換。MATLAB和清除交換空間

+1

交換在操作系統級別進行管理。所有MATLAB可以做的就是向操作系統請求內存。記憶在哪裏存在,無論是物理RAM還是交換,都不在MATLAB的手中。 在某種程度上,您可以使用「whos」和「feature memstats」命令來確定內存使用情況和使用情況。 – siliconwafer

回答

1

你不能。交換不是特殊的,所以只需將其作爲一個常見的內存不足問題解決。如果釋放內存,您將間接釋放用於支持它的交換(或避免使用交換來補充它)。

交換空間只是一個OS管理的虛擬內存備份存儲。從正常程序的角度來看,swap RAM(只是慢速RAM),您不需要單獨管理它。 (嗯......你可以「連線」頁面以防止它們被換出等等,或者使用操作系統API來直接操作交換,但這些是底層特定於平臺的細節(如malloc以下),以及不作爲Matlab M代碼程序員接觸你,而不是你想要在這裏做的事情)。如果你的Matlab程序內存不足,這意味着它已經用完或者碎片化了它的進程的虛擬內存,而不是關於你的swap空間。 (除非某個地方存在低級別錯誤)

發生這種情況時,您可能需要查看Matlab程序中的其他地方(例如,在全局變量,圖形句柄屬性或函數調用堆棧的其他級別)以查找尚未清除的其他數據,或者重新啓動Matlab進程來修復內存碎片(如果您的代碼使用大量小陣列填充內存,則可能會發生這種情況)。

像@siliconwafer暗示的那樣,memory,whosfeature memstats是很好的調試工具。如果你停止在調試器內部,意識到你不能清除所有的東西,除非你在其中出現dbquit

在調試器內部執行大型矩陣操作不一定是可恢復的操作:如果您修改了正在處理的堆棧框架中的本地變量中保存的數組,但仍然存在它們的副本其他變量或框架,Matlab的寫時複製機制需要保存兩個陣列副本,如果達到RAM限制,那麼對於該程序的運行而言,您可能會失敗。

如果退出調試器後clear allclear classes沒有爲您恢復足夠的內存,那麼就像是內存碎片或C級內存泄漏(如在MEX文件中)。無論哪種情況,您都需要重新啓動Matlab來解決它。避免使用大型cellstr陣列或其他小陣列陣列來減少碎片。如果您使用任何自定義MEX功能,請仔細閱讀您的C代碼。

或者您可能沒有足夠的內存來執行您正在執行的操作。