迭代器对象,PyCapsules和内存性能

时间:2012-07-23 14:33:53

标签: python memory-leaks pyqt python-2.7

我正在研究一个PyQt4应用程序而且我已经完成了所有工作,但似乎存在内存泄漏。整个事情的代码相当长,所以我不会在这里发布所有内容。我一直在使用一个名为Python Memory Validator的工具来跟踪我的应用程序的内存分配。我注意到,在程序初始化之后,实例数量继续增加的类最重要的是迭代器,特别是dictionary-keyiteratorlistiteratortupleiterator。除此之外,唯一继续增加实例数量的其他类别为PyCapsulemethod-wrapper

我已经调查了分配迭代器的位置,似乎至少有元组件被实例化,并且每次使用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处理程序类的任何已知问题引起的吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

尝试使用gc module。要调试泄漏的程序调用{​​{1}},您将在gc.set_debug(gc.DEBUG_LEAK)上获得调试输出。