Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyqt:内存使用_Python_User Interface_Pyqt - Fatal编程技术网

Python pyqt:内存使用

Python pyqt:内存使用,python,user-interface,pyqt,Python,User Interface,Pyqt,我有一个程序,它创建了一个选项卡,每次我创建一个选项卡时,内存使用率都会上升,但当我关闭一个选项卡时,内存不会下降。我只是想知道,这正常吗?我能做些什么吗?以下是我关闭选项卡的代码: def removeTab(self, index): text[index].deleteLater() del text[index] # text box # reorganize dict last = -1 for key in sorted(text): if last+

我有一个程序,它创建了一个选项卡,每次我创建一个选项卡时,内存使用率都会上升,但当我关闭一个选项卡时,内存不会下降。我只是想知道,这正常吗?我能做些什么吗?以下是我关闭选项卡的代码:

def removeTab(self, index):

  text[index].deleteLater()
  del text[index] # text box

  # reorganize dict
  last = -1
  for key in sorted(text):
    if last+1 != key:
      text[key-1] = text[key]
      del text[key]
    last += 1

  self.tab_widget.setCurrentIndex(index)
  widget = self.tab_widget.currentWidget()
  self.tab_widget.removeTab(index)  # remove tab
  widget.deleteLater()
  del widget

好的,Google Plus上有人提出了一个建议

凯文·肯尼迪()建议


“.close()before.deleteLater()”

在释放/删除时,由malloc或new分配的常规内存不会返回到系统。相反,它被应用程序保留并重新用于以后的分配。如果需要返回内存,那么应该考虑使用自定义分配器。

您使用的是python。“Del”只删除对象引用,不释放内存。是垃圾收集器负责内存释放(好吧,你不能控制它)

如果在其他地方保留对对象的引用,也会发生同样的情况。

简而言之:

  • python应用程序可用的内存量可能会增加 在它的有生之年,但它永远不能完全缩回到原来的位置 开始

  • 无法强制python将未使用的内存释放回系统

  • 因此,您所能做的最好的事情就是设法管理内存的增长量。一个显而易见的方法是删除不需要的对象,这样新创建的对象就可以重用已经分配的内存

    但是,如果应用程序似乎无法重新使用内存,该怎么办?这要么意味着对象没有被干净地删除(也就是说,有对它们的引用被保存在某个地方),要么就不太可能在PyQt/Qt中存在潜在的内存泄漏

    追踪保留在对象上的额外引用有时会相当棘手(至少可以这么说)。PyQt中一些常见的“隐藏位置”是使用lambda(或functools.partial)或猴子补丁保护方法连接的信号。但是没有硬性规定可以找到它们


    目前,问题中的示例代码似乎没有任何地方可以“隐藏”额外的引用。因此,如果“每次”创建一个选项卡时(如OP所说)内存使用量都会增加,那么问题一定在应用程序中的其他地方——或者更准确地说,问题可能在于如何创建对象,而不是它们是如何被删除的。

    我在Google Plus上发布了这篇文章,因为我希望看到答案。这听起来好像与垃圾收集有关;这是给你修的吗?我不明白为什么。deleteLater()似乎是多余的。@jdi我不是OP。我在Google Plus上分享了这个问题,因为我想找到OP的答案。我对PyQT的了解还不够透彻,无法亲自为OP提供答案。“Google+不再适用于消费者(个人)和品牌帐户”我花了相当多的时间调试我似乎存在的内存泄漏问题。在我删除了一个嵌套很深的小部件中的lambda和partial之后,这个问题就消失了。