【问题标题】:growing python process memory over time随着时间的推移增加python进程内存
【发布时间】:2011-03-07 01:11:51
【问题描述】:

我的 python 代码进程内存动态增加,因为它在必要时将动态数据存储在列表、字典和元组中。尽管之后所有这些动态数据都在其变量中被物理清除,但内存并没有下降。

因此我觉得有内存泄漏,我使用 gc.collect() 方法收集所有未释放的内存。但是当变量中没有数据时,我无法将内存降至最低。

【问题讨论】:

  • 您为什么希望它下降?您使用的是什么操作系统?在许多操作系统中,一旦一个进程获得了内存,这个进程就会保持那么大。
  • 我使用的是 mac osx 10.5,我相信以后它会占用更多空间。目前它已经从初始阶段的 24MB 增长了大约 15MB。我相信进程内存应该以 MB 为单位增长,这可能会影响可用内存大小。

标签: python memory-management


【解决方案1】:

一般来说,一个进程很难“将内存还给操作系统”(直到进程终止并且操作系统取回所有内存,当然)因为(在大多数情况下)实现)malloc 返回的内容是从大块中雕刻出来的以提高效率,但如果它的任何部分仍在使用中,则无法归还整个块——因此,大多数 C 标准库甚至都不会尝试。

有关 Python 上下文中的体面讨论,请参阅例如here。 Evan Jones 修复了一些特定于 Python 的问题,如 herehere 所述,但他的补丁自 Python 2.5 起就在主干中,因此您观察到的问题肯定与系统 malloc 包有关,而不是 Python 本身。 2.6 的具体解释是herehere

一个 SO 线程是 here,Hugh Allen 在他的回答中引用 Firefox 程序员的话说 Mac OS X 是一个基本上不可能进程将内存返回给操作系统。

所以,只有终止一个进程,才能确保释放它的内存。例如,一个长时间运行的服务器可以偶尔将其状态快照到磁盘并关闭(使用一个小的看门狗进程、系统或自定义,监视它并重新启动它)。如果你知道下一个操作会在短时间内占用大量内存,通常你可以os.fork,在子进程中做内存饥饿的工作,并通过 a 将结果(如果有)返回给父进程管道作为子进程终止。以此类推。

【讨论】:

    【解决方案2】:

    我们说的有多大? Python 本身占用了一些内存。我相信最多可能是 30 或 40 MB。如果它比那个大并且没有被收集,那么你就有内存泄漏。只能收集没有引用的垃圾,以某种方式仍然引用您的额外内容。做一个内存配置文件,看看发生了什么。

    【讨论】:

    • 目前它已经从初始阶段的 24MB 增长了大约 15MB,用于最小的场景。但是我尝试了以下链接工具,从中我发现引用的数据不超过 3MB。我无法获得剩余的内存量详细信息。
    • 没那么大。如果你正在寻找一个超低内存的程序,你通常不会用 Python 编写代码。大多数电脑都有 2-4GB 的内存,15MB 不值得担心。
    猜你喜欢
    • 2013-08-10
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2021-02-16
    • 2015-06-01
    • 2013-08-30
    相关资源
    最近更新 更多