2010-06-22 48 views
7

我的python代碼進程內存動態增加,因爲它將動態數據存儲在列表,字典和元組中,只要有需要就可以動態增加數據。儘管所有這些動態數據在其後的變量中被物理清除,但內存不會被拍攝下來。隨着時間的推移增長python進程內存

因此,我覺得有一個內存泄漏,我用gc.collect()方法來收集所有不公正的內存。但是當變量中沒有數據時,我無法將內存降到最低。

+0

你爲什麼期望它下降?你在使用什麼操作系統?在很多操作系統中,一旦進程獲得了內存,進程仍然很大。 – 2010-06-22 21:31:16

+0

我使用mac osx 10.5,我相信後面會吃更多的空間。 目前它在初始階段已經從24MB增加了大約15MB。 我相信進程內存應該以MB的方式增長,這可能會影響可用的內存大小。 – herby 2010-06-22 22:39:29

回答

6

這是很辛苦的,在一般情況下,一個過程「給記憶回到OS」(直到進程終止和OS回來所有的內存,當然),因爲(在大多數實現)什麼malloc返回是爲了提高效率而從大塊中分離出來的,但是如果它的任何部分仍然在使用中,那麼整個塊就不能被回收 - 因此,大多數C標準庫甚至不嘗試。

要在Python上下文中進行體面的討論,請參閱here。 Evan Jones按照herehere的說明修復了一些特定於Python的問題,但是他的補丁自Python 2.5以來就在主幹中,所以您觀察到的問題肯定與系統malloc包有關,而不是Python本身。 2.6的具體解釋是herehere

一個SO線程here,其中休·艾倫在他的回答引用的Firefox程序員的延長是Mac OS X的是一個系統,它基本上是不可能的過程給內存給操作系統。

所以,只有終止一個進程,你才能確保釋放它的內存。例如,長時間運行的服務器可能會將其狀態快照到磁盤並關閉(使用小型監視程序進程,系統或自定義,監視它並重新啓動它)。如果您知道下一個操作會在很短的時間內佔用大量內存,通常您可以os.fork,在子進程中執行需要內存的工作,並通過管道將結果(如果有)返回到父進程,如子進程終止。等等等等。

0

我們說話有多大? Python本身佔用大量的內存..我相信可能高達30或40 MB。如果它比這更大並且未被收集,則會發生內存泄漏。只有沒有引用的垃圾可以被收集,不知何故,你的額外的東西仍然被引用。做一個內存配置文件,看看發生了什麼。

+0

目前它在最小的情況下從初始階段的24MB增加了約15MB。不過,我嘗試了下面的鏈接工具,我發現引用的數據不超過3MB。我無法獲得剩餘的內存細節。 – herby 2010-06-22 22:47:43

+0

這並不是那麼大。如果你正在尋找一個超低內存的程序,你通常不用Python編碼。大多數PC具有2-4GB的RAM,15MB不值得擔心。 – bwawok 2010-06-22 23:06:06

相關問題