我感兴趣的是,当加载一个大对象时,python堆的总大小是如何增加的。heapy似乎是我所需要的,但我不理解结果。
我有一个350MB的pickle文件,其中包含一个pandas DataFrame,其中包含大约250万个条目。当我加载该文件并随后使用heapy检查堆时,它报告只有大约8MB的对象添加到堆中。
import guppy
h = guppy.hpy()
h.setrelheap()
df = pickle.load(open('test-df.pickle'))
h.heap()这将产生以下输出:
Partition of a set of 95278 objects. Total size = 8694448 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 44700 47 4445944 51 4445944 51 str
1 25595 27 1056560 12 5502504 63 tuple
2 6935 7 499320 6 6001824 69 types.CodeType
...让我困惑的是8694448 bytes的Total size。那只有8MB。
为什么Total size不能反映整个DataFrame df的大小
(使用python 2.7.3,heapy 0.1.10,Linux 3.2.0-48-generic-pae (Ubuntu),i686 )
发布于 2013-07-02 19:25:42
你可以试试pympler,我最后一次检查的时候,它对我很有效。如果您只对总内存增加感兴趣,而不是针对特定的类,那么可以调用特定于操作系统的调用来获取总内存使用量。例如,在基于unix的操作系统上,您可以在加载对象之前和之后执行以下操作来获取差异。
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss发布于 2014-07-04 21:30:21
当我试图找出为什么我的500MB CSV文件占用高达5 GB的内存时,我也遇到了类似的问题。Pandas基本上构建在Numpy之上,因此使用C malloc来分配空间。这就是为什么它不会出现在heapy中的原因,heapy只分析纯Python对象。一种解决方案可能是查看valgrind以跟踪内存泄漏。
https://stackoverflow.com/questions/17416669
复制相似问题