我有一個使用Picamera庫的動作檢測腳本。我使用PicameraCircularIO流對象,該對象繼承自CircularIO類(仍然是類的形式,即Picamera庫),它繼承自本機Python BytesIO類。如何從內存中刪除流?
問題是,當記錄到循環流中,然後在磁盤上寫入流的內容時,內存不會被清除。
流已被寫入磁盤上後,這是我做的:
stream.seek(0)
stream.truncate()
我也打過電話stream.flush()
和/或關閉流:stream.close()
,但它並沒有幫助。
我也嘗試刪除所有對流的引用,以便它被垃圾回收(即使這樣做沒有意義,因爲將流截斷爲0大小通常應該可以完成這項工作...)。該流是在一個數組中,所以我做了del streams[index]
。它沒有工作,所以我也嘗試手動調用垃圾收集器:gc.collect()
,沒有任何效果。
它只是在流中正在被寫入內存中的字節,而不是流的大小。例如,如果將2125000字節寫入流中,然後將其截斷,則內存中仍有2125000字節。
任何提示/技巧/答案讚賞。
乾杯!
我不知道這個picamera庫。你如何衡量你的內存大小(即你如何知道自己沒有釋放內存)?問題是您的流程仍在使用內存?如果是這樣,請參閱http://stackoverflow.com/questions/15455048/releasing-memory-in-python您可以產生一個子進程來讀取流,並在完成後讓子進程退出,這將釋放內存。 – RobertB
我正在執行腳本時用'top'命令監視內存。您發佈的鏈接可能很有用,我很快就會看到! – maximedupre
是的,我相信'gc.collect'會將內存標記爲在進程內可重用,但不一定會放棄它。您的過程可能會將其大小保持在內存使用的「高水位」。因此,啓動一個子進程並在完成時退出。操作系統將總是以這種方式收回內存。 – RobertB