1

我有一個使用Picamera庫的動作檢測腳本。我使用PicameraCircularIO流對象,該對象繼承自CircularIO類(仍然是類的形式,即Picamera庫),它繼承自本機Python BytesIO類。如何從內存中刪除流?

問題是,當記錄到循環流中,然後在磁盤上寫入流的內容時,內存不會被清除。

流已被寫入磁盤上後,這是我做的:

stream.seek(0) 
stream.truncate() 

我也打過電話stream.flush()和/或關閉流:stream.close(),但它並沒有幫助。

我也嘗試刪除所有對流的引用,以便它被垃圾回收(即使這樣做沒有意義,因爲將流截斷爲0大小通常應該可以完成這項工作...)。該流是在一個數組中,所以我做了del streams[index]。它沒有工作,所以我也嘗試手動調用垃圾收集器:gc.collect(),沒有任何效果。

它只是在流中正在被寫入內存中的字節,而不是流的大小。例如,如果將2125000字節寫入流中,然後將其截斷,則內存中仍有2125000字節。

任何提示/技巧/答案讚賞。

乾杯!

+1

我不知道這個picamera庫。你如何衡量你的內存大小(即你如何知道自己沒有釋放內存)?問題是您的流程仍在使用內存?如果是這樣,請參閱http://stackoverflow.com/questions/15455048/releasing-memory-in-python您可以產生一個子進程來讀取流,並在完成後讓子進程退出,這將釋放內存。 – RobertB

+0

我正在執行腳本時用'top'命令監視內存。您發佈的鏈接可能很有用,我很快就會看到! – maximedupre

+1

是的,我相信'gc.collect'會將內存標記爲在進程內可重用,但不一定會放棄它。您的過程可能會將其大小保持在內存使用的「高水位」。因此,啓動一個子進程並在完成時退出。操作系統將總是以這種方式收回內存。 – RobertB

回答

1

gc.collect將內存標記爲未使用。由於您的程序需要更多的內存,它應該重用該內存。但是,它可能不會將該內存釋放回操作系統,因此操作系統將繼續報告所使用的內存。一般來說,python進程傾向於保留它們的內存並且不會釋放它,因此它們的內存總佔用空間將代表內存使用率的「高水位」。

就你而言,這應該是因爲你釋放流。如果您開始使用其他流,則應重複使用相同的空間,並且您的「頂級」報告不應顯示大小的增加。

有關更詳細的解釋,請參閱Releasing memory in Python

+0

但我不需要手動調用'gc.collect',因爲垃圾收集器會自動完成它的工作,對吧? – maximedupre

+0

通常。我不會打擾。 – RobertB