我在多个地方看到有同学特别爱提「Python内存溢出」,其实大部分是自己的程序逻辑写的有问题甚至是一种错觉,也有一些新人会提「如何知道我的程序使用了多少内存」这样的问题。那么如何去了解你的进程使用了多少内存呢?

最常用的就是resource模块,也是我最推荐的方案(我的书里面竟然没有写进去这部分内容,失败)。如果你感觉这个模块好陌生也是正常的,这个资源使用信息的模块平时确实用到的机会不多:

1
2
3
4
5
6
7
8
9
10
11
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点:

  1. 不同平台上ru_maxrss的值的单位是不一样的,在OS X上单位是Byte,但是在Linux上单位是KB。我之前用惯了OS X,一次查看现在程序内存使用,看到上述方法的返回值太小,数量级上差了好多,觉得明显不对啊,困惑了很久,最后还是直接去翻libbc的手册才知道这个区别。大家要注意。
  2. 上面用到的resource.RUSAGE_SELF表示当前进程自己,如果你希望知道该进程下已结束子进程的内存也计算进来,需要使用resource.RUSAGE_CHILDREN。另外还有一个RUSAGE_BOTH相当于当前进程和子进程自己的总和,不过这个是平台相关的,你要先了解你是用的发行版本是否提供。

###