【问题标题】:Python process consuming increasing amounts of system memory, but heapy shows roughly constant usagePython 进程消耗越来越多的系统内存,但 heapy 显示大致恒定的使用情况
【发布时间】:2013-05-13 01:19:52
【问题描述】:

我正在尝试识别我正在处理的 Python 程序中的内存泄漏。我目前在 Mac OS 64 位上运行 Python 2.7.4。我安装了 heapy 来解决这个问题。

该程序涉及使用搁置模块创建、存储和读取大型数据库。我没有使用 writeback 选项,我知道这会造成内存问题。

Heapy usage 显示在程序执行过程中,内存大致保持不变。然而,我的活动监视器显示内存迅速增加。在 15 分钟内,该进程消耗了我所有的系统内存 (16gb),并且我开始看到页面输出。知道为什么 heapy 没有正确跟踪这个吗?

【问题讨论】:

    标签: python macos


    【解决方案1】:

    看看this fine article。您很可能没有看到内存泄漏,而是看到了内存碎片。我发现的最佳解决方法是确定大型工作集操作的实际输出是什么,在新进程中加载​​大型数据集,计算输出,然后将该输出返回到原始进程。

    This answer 也有一些很好的洞察力和一个例子。我在您的问题中没有看到任何似乎会排除使用 PyPy 的内容。

    【讨论】:

    • 程序的第一步是构建数据库本身。我生成一个新条目,将其存储到架子上,然后继续下一个。我不确定大集合的“输出”会是什么。物品被推到架子上后,我应该释放它吗?
    • 很难说没有更多的程序知识。您要序列化到的文件有多大?您正在创建的对象的范围有多窄?为什么必须使用搁置模块?搁置后是否有更多对该对象的引用? 2 个注意事项:1)我真的不需要任何这些问题的具体答案,但你应该考虑它们,2)没有“释放”对象的好方法。根据引用计数器是否无法访问,它会或不会在下一次收集期间收集垃圾。
    • 创建 db 后文件大小约为 4gb。建立数据库后,我需要一次对一个对象进行分析。我决定使用搁置模块来节省内存。我检查了一下,gc.garbage 在整个程序构建过程中返回一个空列表。 del 命令不会释放内存?
    • 不。 del 只是使符号在当前范围内无法访问并减少引用计数。
    • 我重写了初始代码,以便对数据库进行实际分析,这样每个进程(使用子进程)只能看到数据库的一部分,并且工作正常。我认为碎片化确实是问题所在。感谢您的帮助。
    猜你喜欢
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多