如何了解你的进程使用了多少内存?
/ / / 阅读数:5273我在多个地方看到有同学特别爱提「Python 内存溢出」,其实大部分是自己的程序逻辑写的有问题甚至是一种错觉,也有一些新人会提「如何知道我的程序使用了多少内存」这样的问题。那么如何去了解你的进程使用了多少内存呢?
最常用的就是 resource 模块,也是我最推荐的方案(我的书里面竟然没有写进去这部分内容,失败)。如果你感觉这个模块好陌生也是正常的,这个资源使用信息的模块平时确实用到的机会不多:
import resource mem_init = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss l = [] for i in range(500000): l.append(object()) mem_final = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss del l print('Class: {}:\n'.format(getattr(cls, '__name__'))) print('Initial RAM usage: {:14,}'.format(mem_init)) print(' Final RAM usage: {:14,}'.format(mem_final)) |
内存使用就是 mem_final - mem_init。但是要注意 2 点:
- 不同平台上 ru_maxrss 的值的单位是不一样的,在 OS X 上单位是 Byte,但是在 Linux 上单位是 KB。我之前用惯了 OS X,一次查看现在程序内存使用,看到上述方法的返回值太小,数量级上差了好多,觉得明显不对啊,困惑了很久,最后还是直接去翻 libbc 的手册 才知道这个区别。大家要注意。
- 上面用到的 resource.RUSAGE_SELF 表示当前进程自己,如果你希望知道该进程下已结束子进程的内存也计算进来,需要使用 resource.RUSAGE_CHILDREN。另外还有一个 RUSAGE_BOTH 相当于当前进程和子进程自己的总和,不过这个是平台相关的,你要先了解你是用的发行版本是否提供。