3

我正在开发一个 PyQt4 应用程序,我几乎完成了,除了似乎存在内存泄漏。整个东西的代码相当长,所以我不会在这里发布所有内容。我一直在使用一个名为 Python Memory Validator 的工具来跟踪我的应用程序的内存分配。我注意到在程序初始化后实例数量继续增加的类是迭代器,特别dictionary-keyiterator是 、listiteratortupleiterator. 除了这些之外,实例数量继续增加的唯一其他类是PyCapsulemethod-wrapper

我调查了分配迭代器的位置,似乎每次使用该zip()函数时至少实例化了 tupleiterators 并且从未删除过。这是正常行为还是这些迭代器可能是内存泄漏的原因?如果是这样,是否有解决方法?

我还调查了 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())

这主要包括实例化和使用SaxSensorDataHandler作为重新实现的股票 PyQt 类QXmlDefaultHandler,并且唯一重新实现的方法是在读取 XML 标记时由 XML 处理程序调用的方法。我对这些方法所做的只是将检索到的信息分配给变量并调用另一个方法来更新容器中的相应变量,因此这不应该导致内存泄漏。那么内存泄漏是否可能是由 PyQt4 的 Xml 处理程序类的任何已知问题引起的?

提前感谢您的帮助!

4

1 回答 1

0

尝试使用gc 模块。要调试泄漏的程序调用gc.set_debug(gc.DEBUG_LEAK),您将在sys.stderr.

于 2012-09-01T21:52:15.803 回答