Python GTK 内存分配问题

Posted

技术标签:

【中文标题】Python GTK 内存分配问题【英文标题】:Python GTK Memory allocation problems 【发布时间】:2013-01-29 10:57:18 【问题描述】:

我实际上是在尝试在我的 python gtk 应用程序中修复我的内存问题。

我已经阅读了很多关于python中内存使用的文章,但我无法全部了解,所以我希望你能在这里帮助我。

因此,如果我启动我的应用程序并打开设置窗口,我的内存使用量为 32368 KB。

现在如果我关闭设置窗口,内存使用量也是 32368 KB。

这是我如何打开和关闭设置窗口的代码示例:

ma​​in.py

...
    def show_settings(self):
        self.settings = Settings()
        self.settings.window.connect("destroy", self.clear_settings)

    def clear_settings(self, widget, Data=None):
        del self.settings


class Settings():
    def __init__():
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        ...

现在我尝试使用 objgraph 分析活动引用。结果是这样的:

打开设置窗口

关闭设置窗口后

有人可以帮助如何释放内存吗?

【问题讨论】:

【参考方案1】:

Python 中的内存分配发生在多个级别。首先,内存是由 C 库的系统分配器组件从系统分配的(这将显示在 Unix ps 或 Windows task manager 给出的内存使用数据中)。然后,分配的内存由 C 库调用(如 malloc)以更小的块分配,而如果更小的块则由 Python 自己的内存分配器(用于存储对象)分配。此外,Python 为不同的对象维护不同的分配池(以优化某些对象,例如 str vs int)。

为了将内存返回给系统,它必须先由 Python 的分配器取消分配,然后再由 C 库的堆分配器和页面分配器取消分配。何时发生这种情况很难确定,因为它取决于许多因素,例如您运行的系统、C 库的版本、Python 自己的版本和您的应用程序的分配模式。

分配器通常会保留一些空闲内存(称为空闲列表),以便通过避免每次需要新内存时进行系统调用(代价高昂)来加快分配速度。每个分配器都会有一些阈值,这些阈值确定内存何时实际分配或释放到下一个级别。

所以你不能指望通过删除一个对象来改变系统内存分配(即 ps / task manager 输出)。

如果您有特定的内存分配问题,有些是巨大的临时对象,并且您希望随着时间的推移尽量减少内存使用量,那么您需要提出一个更具体的问题 :)

【讨论】:

【参考方案2】:

我觉得这里没有错。你的Settings实例被释放后消失了,这是正常的。您如何测量内存使用情况?

【讨论】:

每次我打开设置窗口,都会分配大约 18kB 的新内存(用 ps auxww 测量)。但它永远不会发布。现在如果你这样做几次,内存使用量会不断增加 很难正确测量内存使用情况,尤其是在涉及库时。对于“大局”测量,我使用ps -eo rss,cmd --sort=rss 在底部查看使用最多RSS 内存的应用程序。但是对于缓存、特殊的SLAB 内存分配器和所有其他内存管理的东西,我同意isedev 的观点,你不能想当然地认为释放一些内存会对内存消耗产生即时影响。 顺便说一句,您使用的是 Windows、Linux 还是其他? 所以没有什么特别的问题。在 Windows 上,直到最近的 GTK 2.24.14 出现了一些内存泄漏。

以上是关于Python GTK 内存分配问题的主要内容,如果未能解决你的问题,请参考以下文章

Python 切片分配内存使用情况

了解 Python 中大整数的内存分配

python如何获得BytesIO分配的内存长度?

python中for循环的内存分配

Python列出内存分配[重复]

Python MemoryError:无法分配数组内存