我有一个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.>
由于某种原因,它仅占5GB的12MB(numpy
阵列肯定会占用大部分内存)。
关于我可能做错了heapy
什么或应该尝试使用其他工具的任何建议(本线程中已经提到的那些除外)?
Numpy(及其库绑定,一分钟内会详细介绍)使用C
malloc分配空间,这就是为什么大型numpy分配使用的内存不会出现在诸如堆之类的配置文件中并且永远不会被垃圾清理的原因集电极。
通常,大泄漏的怀疑实际上是scipy或numpy库绑定,而不是python代码本身。去年,我被umfpack的默认scipy.linalg接口严重烧毁,该接口以每次呼叫约10Mb的速度泄漏内存。您可能想尝试使用valgrind之类的东西来分析代码。它通常可以提供一些提示,指出在哪里查看可能存在泄漏的地方。
物理内存探测 物理内存的相关概念 我们知道,物理地址访问的通常是一片 DRAM,我们可以把它看成一个以字节为单位的大数组,通过物理地址找到对应的位置进行读写。但是,物理地址并不仅仅只能访问 DRAM,也可以用来访问其他的外设,因此你也可以认为 DRAM 也算是一种外设,物理地址则是一个对可以存储的介质的一种抽象。 而如果访问其他外设要使用不同的指令(如 x86 单独提供了 in 和 out 等指令
我正在使用python来分析一些大文件,我遇到了内存问题,所以我一直在使用sys.getsizeof()来尝试跟踪使用情况,但是它在Numpy数组中的行为很奇怪。这里有一个例子,涉及到我必须打开的反照率地图: 数据仍然存在,但是对象的大小,一个3600x7200像素的映射,已经从200 Mb变为80字节。我希望我的内存问题结束,把所有的东西都转换成numpy数组,但我觉得这种行为,如果是真的,会在
used_memory:859192数据结构的空间 used_memory_rss:7634944实占空间 mem_fragmentation_ratio:8.89前2者的比例,1.N为佳,如果此值过大,说明redis的内存的碎片化严重,可以导出再导入一次.
script/下的memstat.sh或者ps_mem.py都可以查看系统的内存情况,两个工具都需要root权限。
#!/bin/bash # Get current swap usage for all running processes # Erik Ljungstrom 27/05/2011 # Modified by Mikko Rantalainen 2012-08-09 # Pipe the output to "sort -nk3" to get sorted output # Modified
探测系统物理内存布局 当 ucore 被启动之后,最重要的事情就是知道还有多少内存可用,一般来说,获取内存大小的方法由 BIOS 中断调用和直接探测两种。但BIOS 中断调用方法是一般只能在实模式下完成,而直接探测方法必须在保护模式下完成。通过 BIOS 中断获取内存布局有三种方式,都是基于INT 15h中断,分别为88h e801h e820h。但是 并非在所有情况下这三种方式都能工作。在 Li