2012-07-23 30 views
3

我工作的一個PyQt4的應用程序,我所有,但完成後,除了似乎有內存泄漏。整個事情的代碼很長,所以我不會在這裏發佈所有的代碼。我一直在使用名爲Python Memory Validator的工具來跟蹤我的應用程序的內存分配。我注意到,它繼續在實例的數量增加了程序初始化後的類,最突出,迭代器,特別是dictionary-keyiteratorlistiteratortupleiterator。除了這些,唯一的其他類,其繼續在實例的數量增加是PyCapsulemethod-wrapper迭代器對象,PyCapsules和內存性能

我已經調查了迭代器的分配位置,似乎至少tupleiterators實例化,並且從不刪除每次我使用zip()函數。這是正常的行爲還是這些迭代器可能是內存泄漏的原因?如果是這樣,是否有解決方法?

我也調查了其中PyCapsules和方法,包裝已經被實例化並同時出現從一個方法創建了下面的代碼,並且永遠不會被刪除。

def importXml(self, fh): 
    error = None 
    try: 
     handler = SaxSensorDataHandler(self) 
     parser = QXmlSimpleReader() 
     parser.setContentHandler(handler) 
     parser.setErrorHandler(handler) 
     input_ = QXmlInputSource(fh) 
     self.new = True 
     if not parser.parse(input_): 
      if handler.errorLine == 4: 
       self.new = False 
      else: 
       raise ValueError 
    except (IOError, OSError, ValueError), e: 
     error = "Failed to import file: %s" % e 
    finally: 
     if fh is not None: 
      fh.close() 
     if error is not None: 
      return False, error 
     if len(self.__sensors) == 0: 
      return False, "Discovered no sensors connected to %s. Please check sensor connections and try again." % fh.url().host() 
     self.__dirty = True 
     return True, 'Discovered %d sensors connected to %s. Please press "Start" to begin taking measurements.' %(len(self.__sensors), fh.url().host()) 

這主要包括初始化,並用股票PyQt的班,SaxSensorDataHandler是一個重新實現QXmlDefaultHandler的,唯一的方法重新實現是那些由XML處理程序調用通過XML標籤讀取時間。我對這些方法所做的全部工作是將檢索到的信息分配給變量,並調用另一個更新容器中相應變量的方法,所以這不應該導致內存泄漏。內存泄漏可能是由PyQt4的Xml處理程序類的任何已知問題引起的?

在此先感謝您的幫助!

回答

0

嘗試使用gc module。要調試一個漏水的程序調用gc.set_debug(gc.DEBUG_LEAK),你會得到sys.stderr調試輸出。