2010-03-22 71 views
8

我正在運行一個劇本動畫劇情(模擬水流)。過了一段時間,我通過按ctrl-c來殺死循環。 做了幾次之後,我得到的錯誤:在matlab中沒有釋放內存?

??? Error: Out of memory. 

我開始接收這個錯誤後,給我的腳本每次調用會自動產生。
現在,它發生在我正在調用的函數內部的任何內容之前,即使我添加行a=1作爲我調用的函數的第一行,仍然出現錯誤並且沒有打印輸出,所以內部代碼該函數甚至沒有執行。 這可能是什麼原因造成的?

+1

請提供一些代碼,並告訴我們您使用的是什麼Matlab解釋器(包括版本)。 – 2010-03-23 00:03:21

回答

8

有幾種可能的原因。

  1. 很可能你的腳本創建了一些變量來填充內存。重新啓動腳本之前運行

    clear all 
    

    ,讓所有的變量都被清除,或者改變你的腳本功能(這會自動刪除函數返回後所有臨時變量)。

  2. 也許你是通過繪製彼此的幾個圖(不先清除軸)來繪製動畫。因此,您可能會用完Java堆空間。您可以單獨關閉打開的數字,或運行

    close all 
    

    你也可以增加你的系統上的Java內存Matlab的的使用量(see instructions here) - 注意,限制一般是相當低的,煩人的,所以如果你想噸的數字。

  3. 尤其是如果您運行的是Windows的較舊版本,則可能會導致內存碎片化。 Matlab需要連續的可用空間塊來分配變量。要檢查內存碎片,請運行

    memory 
    

    並查看最大可能變量大小的編號。如果這比所有陣列的可用尺寸小得多,現在是時候重新啓動Matlab(我猜如果你使用Windows版本,需要重新啓動才能解決問題,你可能需要考慮使用Win7獲得一臺新電腦) 。

+0

謝謝!我的問題正是#2 – olamundo 2010-03-23 07:29:56

+3

+1。對於案例3,您不需要重新啓動。碎片發生在分配給Matlab過程的虛擬內存空間中;重新啓動Matlab足以獲得一個乾淨的石板。 – 2010-03-24 18:05:55

+0

感謝您的澄清。如果我記得正確,在Windows NT上(或者是Win95?),我們必須完全重啓。我很高興這個世界有進步! – Jonas 2010-03-24 18:22:41

2

這聽起來像你沒有清除你的任何變量。你應該提供一種方法來停止循環而不用按ctrl-c(用一個「Stop」按鈕和你的顯示器編寫一個簡單的GUI),然後清除腳本中的工作區或在腳本開始時清除變量。

您是否有意在循環的每次迭代中存儲所有數據(或某個大組件)?

3

你也可以試試pack命令,如:

close all; 
clear all; 
pack; 

清除內存。儘管在最近的數學工作研討會之後,我問了一位數學工作者的大師,並且他也符合安德魯傑克關於記憶碎片的評論。通常退出並重新啓動matlab爲我排序(在XP上)。

4

clear allclose all是釋放記憶的直接方式,它是所有非初學者都知道的。

主要問題是,當你完成了一些數據大數據處理,並清除/關閉了所有的東西 - 仍然存在matlab使用的重要內存。

這是一個目前與matlab的主要問題,據我所知有沒有解決方案,而不是重新啓動matlab,這是一個遺憾。