如何在Python中顯式釋放內存?

我編寫了一個Python程序,該程序做用於大型輸入文件,以建立表明三角形的數百萬個對象。 該算法是: html

  1. 讀取輸入文件
  2. 處理文件並建立由三角形頂點表示的三角形列表
  3. 以OFF格式輸出頂點:一個頂點列表,後跟一個三角形列表。 三角形由頂點列表中的索引表示

在打印三角形以前先打印出完整的頂點列表的OFF要求意味着在將輸出寫入文件以前,必須將三角形列表保留在內存中。 同時,因爲列表的大小,我遇到了內存錯誤。 python

告訴Python我再也不須要某些數據而且能夠釋放它們的最佳方法是什麼? 算法


#1樓

Python是垃圾回收的,所以,若是減少列表的大小,它將回收內存。 您還可使用「 del」語句徹底擺脫變量: 優化

biglist = [blah,blah,blah]
#...
del biglist

#2樓

del語句可能有用,可是IIRC 不能保證釋放內存文檔在這裏 ... 爲何不發佈spa

我據說Linux和Unix類型系統上的人們分叉python進程來作一些工做,得到結果真後殺死它。 操作系統

本文對Python垃圾收集器進行了說明,但我認爲缺少內存控制是託管內存的缺點 .net


#3樓

您不能顯式釋放內存。 您須要作的是確保您不保留對對象的引用。 而後將對它們進行垃圾回收,從而釋放內存。 code

對於您的狀況,當您須要大型列表時,一般須要從新組織代碼,一般使用生成器/迭代器。 這樣,您根本就不須要在內存中存儲大型列表。 htm

http://www.prasannatech.net/2009/07/introduction-python-generators.html 對象


#4樓

根據Python官方文檔 ,您可使用gc.collect()強制垃圾gc.collect()器釋放未引用的內存。 例:

import gc
gc.collect()

#5樓

不幸的是(取決於您的Python版本和版本),某些類型的對象使用「空閒列表」,這是一種整潔的局部優化,但可能會致使內存碎片,特別是經過使愈來愈多的「專用」內存僅用於特定類型的對象而引發的內存碎片。所以沒法使用「普通基金」。

確保確實大量但臨時使用內存的惟一可靠方法是在完成後將全部資源返回系統,這是在子進程中進行,該進程須要大量內存,而後終止。 在這種狀況下,操做系統將完成其工做,並樂意回收子進程可能吞沒的全部資源。 幸運的是,在現代版本的Python中, multiprocessing模塊使這種操做(之前是很痛苦的)不太糟糕。

在您的用例中,彷佛子過程累積一些結果並確保這些結果可用於主過程的最佳方法是使用半臨時文件(我所說的是半臨時文件,而不是那種關閉後會自動消失,只會刪除您用完後會明確刪除的普通文件)。

相關文章
相關標籤/搜索