Linux上的Python内存消耗:物理和虚拟内存正在增长,而堆大小仍然是sam

2024-04-26 13:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究用Python编写的某种系统服务(实际上它只是一个日志解析器)。这个程序应该持续工作很长一段时间(希望我指的是没有失败和需要重新启动的日子和星期)。这就是我为什么担心内存消耗的原因。

我将不同站点的进程内存使用情况的不同信息组合成一个简单的函数:

#!/usr/bin/env python
from pprint import pprint
from guppy import hpy
from datetime import datetime
import sys
import os
import resource
import re

def debug_memory_leak():
    #Getting virtual memory size 
    pid = os.getpid()
    with open(os.path.join("/proc", str(pid), "status")) as f:
        lines = f.readlines()
    _vmsize = [l for l in lines if l.startswith("VmSize")][0]
    vmsize = int(_vmsize.split()[1])

    #Getting physical memory size  
    pmsize = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss

    #Analyzing the dynamical memory segment - total number of objects in memory and heap size
    h = hpy().heap()
    if __debug__:
        print str(h)
    m = re.match(
        "Partition of a set of ([0-9]+) objects. Total size = ([0-9]+) bytes(.*)", str(h))
    objects = m.group(1)
    heap = int(m.group(2))/1024 #to Kb

    current_time = datetime.now().strftime("%H:%M:%S")
    data = (current_time, objects, heap, pmsize, vmsize)
    print("\t".join([str(d) for d in data]))

这个函数已经被用来研究我长时间游戏过程中记忆消耗的动态,我仍然无法解释它的行为。您可以看到堆大小和对象总数没有改变,而物理和虚拟内存在这20分钟内分别增加了11%和1%。

升级版:到目前为止,该流程已运行了近15个小时。堆仍然不变,但是物理内存增加了6倍,虚拟内存增加了50%。曲线似乎是线性的,除了凌晨3点的奇怪异常值:

Time Obj Heap PhM VM

19:04:19 31424 3928 5460 143732

19:04:29 30582 3704 10276 158240

19:04:39 30582 3704 10372 157772

19:04:50 30582 3709 10372 157772

19:05:00 30582 3704 10372 157772

(...)

19:25:00 30583 3704 11524 159900

09:53:23 30581 3704 62380 210756

我想知道我的进程的地址空间是怎么回事。堆的恒定大小表明所有的动态对象都被正确地释放。但我毫不怀疑,从长远来看,不断增长的记忆消耗将影响这一生命关键过程的可持续性。

enter image description here

有人能澄清一下这个问题吗?谢谢您。

(我在Python2.6.6中使用RHEL6.4、内核2.6.32-358)


Tags: of内存infromimportsizedatetimeobjects
1条回答
网友
1楼 · 发布于 2024-04-26 13:25:18

不知道你的程序在做什么,这可能会有帮助。

前段时间我在做一个项目的时候遇到了这篇文章: http://chase-seibert.github.io/blog/2013/08/03/diagnosing-memory-leaks-python.html 也就是说,“运行时消耗大量内存的长时间运行的Python作业可能在进程实际终止之前不会将内存返回到操作系统,即使所有内容都被正确地垃圾回收了。”

最后,我使用了多处理模块,让我的项目从一个单独的进程中分离出来,并在需要工作时返回,此后我就没有注意到任何内存问题。

或者在Python 3.3http://bugs.python.org/issue11849中尝试

相关问题 更多 >