2011-09-17 43 views
3

Python​​有沒有已知的內存泄漏?我正在研究Python腳本,其代碼如下所示,使用​​,由於某些原因導致內存泄漏。本例中的「while True」用於測試調用函數引起的泄漏。它被Windows上使用Python 2.5.4運行:Python:CTypes結構內存泄漏

import ctypes 
def hi(): 
    class c1(ctypes.Structure): 
      _fields_=[('f1',ctypes.c_uint8)] 
    class c2(ctypes.Structure): 
      _fields_=[('g1',c1*2)] 

while True: 
    test=hi() 

泄漏可以使用ProcessExplorer進行測試 - 因爲它不斷循環,Python會越來越多的內存佔用。它似乎需要有兩個Structure子類,其中一個類具有另一個類的「倍數」(使用*運算符),但我不確定該條件是否比這更基本。即使循環中添加了del test,仍然會泄漏內存。

關於可能導致此問題的任何想法?

編輯:因爲有人認爲它可能沒有垃圾回收的是,這裏是一個編輯的版本,做垃圾收集,但仍然出現內存泄漏:

import gc 
import ctypes 
def hi(): 
    class c1(ctypes.Structure): 
      _fields_=[('f1',ctypes.c_uint8)] 
    class c2(ctypes.Structure): 
      _fields_=[('g1',c1*2)] 

while True: 
    test=hi() 
    test2=gc.collect() 
+0

它泄漏多少?它爲每個創建的「c1」創建一個字節?有一個計數器,每打印50,000個電話給'hi()'左右,所以你知道。 – agf

+0

在ProcessExplorer中,「工作集」內存每秒穩定增加大約20-30 KB,「私人字節」每隔一段時間都會穩步增長。大約12分鐘後,我已經超過59 MB的內存,並計算在解釋器中運行的第二個片段。如何在代碼中放置一個計數器,告訴你有多少內存被佔用?任何人都可以在此證實我嗎? – user553702

+0

最簡單的方法是在頂部添加'from itertools import count',然後在count():中將c改爲'true:',然後在循環中添加'如果不是c%50000:print c' 。然後,如果「印刷品」過於頻繁或不常用,則增加或減少「50000」。 – agf

回答

2

這不是內存泄漏,這只是意味着垃圾收集器尚未運行。即使垃圾收集器運行,可能性也很大,有一些內存池正在進行。

ProcessExplorer不是一個好的調試工具,特別是對於內存。

+0

即使我在循環內部添加了「import gc」,並且在循環內部添加了「test2 = gc.collect()」,它佔用的內存仍然保持增長。 「內存池」是什麼意思?記憶在某些時候不應該被釋放嗎? – user553702

+0

內存池意味着一個區域被放置在一邊(在Python中),它保存着空閒的內存。這是一種優化技術。它只*看起來像正在使用的內存。 –

1

腳本本身不泄漏。使用gc.set_debug(gc.DEBUG_LEAK)運行時顯示創建的結構類型是可收集的,並且gc.garbage在每個循環迭代中都保持爲空,所以不存在無法收集的對象。在Linux系統上運行time的腳本也不會顯示內存消耗的穩步增加。