Python numpy内存分析器

Python numpy内存分析器,python,memory,numpy,memory-profiling,Python,Memory,Numpy,Memory Profiling,我有一个numpy脚本,根据top,它使用了大约5GB的RAM: 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

我有一个
numpy
脚本,根据
top
,它使用了大约5GB的RAM:

  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.>
一组90956对象的分区。总大小=12511160字节。 索引计数%Size%累计%Kind(类/类的目录) 0 42464 47 4853112 39 4853112 39街 12214724192876815678188054元组 2 287 0 1093352 9 7875232 63模块目录 3 5734 6 733952 6 8609184 69类型。代码类型 4498171390469323088 75 dict(无所有者) 5 5431 6 651720 5 9974808 80功能 6 489 1 512856 4 10487664 84类型的dict 748914377041092536887型 82610281208211206576 90课堂记录 9162921303201133689691内置包装描述符 出于某种原因,它只占5GB中的12MB(大部分内存几乎肯定被
numpy
阵列使用)

任何关于我在使用heapy时可能出错的建议,或者关于我应该尝试哪些其他工具(中已经提到的除外)?

Numpy(及其库绑定,稍后将详细介绍)使用C malloc分配空间,这就是为什么大numpy分配使用的内存不会出现在诸如heapy之类的配置文件中,也不会被垃圾收集器清除


大泄漏的常见嫌疑实际上是scipy或numpy库绑定,而不是python代码本身。去年,我被umfpack的默认scipy.linalg接口严重烧坏,该接口以每次调用大约10Mb的速度泄漏内存。您可能希望尝试valgrind之类的方法来分析代码。它通常可以提供一些提示,说明在哪里可以查看哪里可能存在泄漏。

是的,但仍有一些情况下,最好知道numpy/scipy阵列的大小,例如,在调试您自己的150000应用程序中的内存泄漏时,您正在左右传递和复制阵列,您知道问题出在您自己的代码中。如果pympler等可以使用
array.nbytes
属性来给出有意义的结果,那就太好了。