根据top
的说法,我有一个numpy
脚本,它使用了大约5 5GB的内存:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16994 aix 25 0 5813m 5.2g 5.1g S 0.0 22.1 52:19.66 ipython
有没有内存分析器可以让我对占用大部分内存的对象有一些了解?
我试过heapy
,但guppy.hpy().heap()
给了我这个:
Partition of a set of 90956 objects. Total size = 12511160 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 42464 47 4853112 39 4853112 39 str
1 22147 24 1928768 15 6781880 54 tuple
2 287 0 1093352 9 7875232 63 dict of module
3 5734 6 733952 6 8609184 69 types.CodeType
4 498 1 713904 6 9323088 75 dict (no owner)
5 5431 6 651720 5 9974808 80 function
6 489 1 512856 4 10487664 84 dict of type
7 489 1 437704 3 10925368 87 type
8 261 0 281208 2 11206576 90 dict of class
9 1629 2 130320 1 11336896 91 __builtin__.wrapper_descriptor
<285 more rows. Type e.g. '_.more' to view.>
由于某些原因,它只占5 5GB内存中的12MB (大部分内存几乎肯定是由numpy
数组使用的)。
关于我在heapy
上可能做错了什么,或者我应该尝试其他什么工具(除了this thread中已经提到的那些工具),有什么建议吗?
发布于 2011-05-16 22:45:27
Numpy (和它的库绑定,马上会有更多)使用allocate来分配空间,这就是为什么大numpy分配所使用的内存不会出现在像heapy这样的分析中,也不会被垃圾收集器清理。
大泄漏的常见疑点实际上是scipy或numpy库绑定,而不是python代码本身。去年,我被umfpack的默认scipy.linalg接口弄得焦头烂额,它以每次10Mb的速度泄漏内存。您可能希望尝试使用valgrind之类的命令来分析代码。它通常可以提供一些提示,说明在哪里可以查看可能存在泄漏的地方。
https://stackoverflow.com/questions/6018986
复制相似问题