簡體   English   中英

在 Python 中強制垃圾收集以釋放內存

[英]Force garbage collection in Python to free memory

我有一個 Python2.7 應用程序,它使用了很多dict對象,這些對象主要包含鍵和值的字符串。

有時不再需要這些字典和字符串,我想從內存中刪除它們。

我嘗試了不同的東西, del dict[key]del dict等。但應用程序仍然使用相同數量的內存。

下面是我希望為內存收費的示例。 但它沒有:(

import gc
import resource

def mem():
    print('Memory usage         : % 2.2f MB' % round(
        resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024.0/1024.0,1)
    )

mem()

print('...creating list of dicts...')
n = 10000
l = []
for i in xrange(n):
    a = 1000*'a'
    b = 1000*'b'
    l.append({ 'a' : a, 'b' : b })

mem()

print('...deleting list items...')

for i in xrange(n):
    l.pop(0)

mem()

print('GC collected objects : %d' % gc.collect())

mem()

輸出:

Memory usage         :  4.30 MB
...creating list of dicts...
Memory usage         :  36.70 MB
...deleting list items...
Memory usage         :  36.70 MB
GC collected objects : 0
Memory usage         :  36.70 MB

我希望在這里“收集”一些對象並釋放一些內存。

難道我做錯了什么? 刪除未使用的對象或至少找到意外使用對象的位置的任何其他方法。

弗雷德里克·倫德 (Frederick Lundh) 解釋說

如果你創建了一個大對象並再次刪除它,Python 可能已經釋放了內存,但是所涉及的內存分配器不一定會將內存返回給操作系統,因此看起來 Python 進程使用了​​更多的虛擬內存比它實際使用。

亞歷克斯·馬泰利寫道

確保大量但臨時的內存使用在完成后將所有資源返回給系統的唯一真正可靠的方法是讓該使用發生在子進程中,該子進程會執行需要內存的工作然后終止。

因此,您可以使用multiprocessing來生成子進程,執行內存占用計算,然后確保在子進程終止時釋放內存:

import multiprocessing as mp
import resource

def mem():
    print('Memory usage         : % 2.2f MB' % round(
        resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024.0,1)
    )

mem()

def memoryhog():
    print('...creating list of dicts...')
    n = 10**5
    l = []
    for i in xrange(n):
        a = 1000*'a'
        b = 1000*'b'
        l.append({ 'a' : a, 'b' : b })
    mem()

proc = mp.Process(target=memoryhog)
proc.start()
proc.join()

mem()

產量

Memory usage         :  5.80 MB
...creating list of dicts...
Memory usage         :  234.20 MB
Memory usage         :  5.90 MB

這可能有點有用,使用多處理和一個名為 Ray 的庫,它使用共享內存在進程之間執行多 GB 數據共享。 這種方式很容易生成輔助進程,並且仍然可以快速輕松地從父進程訪問相同的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM