【问题标题】:Iterator Objects, PyCapsules, and Memory Performance迭代器对象、PyCapsules 和内存性能
【发布时间】:2012-07-21 19:33:30
【问题描述】:

我正在开发一个 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 处理程序类的任何已知问题引起的?

提前感谢您的帮助!

【问题讨论】:

    标签: python memory-leaks pyqt python-2.7


    【解决方案1】:

    尝试使用gc module。调试泄漏程序调用gc.set_debug(gc.DEBUG_LEAK),您将在sys.stderr 上获得调试输出。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 2023-03-24
      • 1970-01-01
      • 2019-08-22
      相关资源
      最近更新 更多