我很想知道加载大对象时python堆总大小的增加。很多似乎是我需要的,但我不明白结果。
我有一个350 MB的pickle文件,其中包含一个pandas DataFrame
,其中包含大约250万个条目。当我加载文件并随后用heapy检查堆时,它会报告只有大约8 MB的对象被添加到堆中。
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
...
让我感到困惑的是Total size
的{{1}}。那只是8 MB。
为什么8694448 bytes
没有反映整个Total size
DataFrame
的大小?
(使用python 2.7.3,heapy 0.1.10,Linux 3.2.0-48-generic-pae(Ubuntu),i686)
答案 0 :(得分:0)
你可以尝试pympler,这是我最后一次检查时对我有用的。如果您只对总内存增加感兴趣而不是对特定类感兴趣,则可以通过OS特定调用来获取总内存使用量。例如,在基于unix的操作系统上,您可以在加载对象之前和之后执行以下操作以获取差异。
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
答案 1 :(得分:0)
当我试图找出为什么我的500 MB CSV文件在内存中占用5 GB时,我遇到了类似的问题。 Pandas基本上构建在Numpy之上,因此使用C malloc来分配空间。这就是为什么它不会出现在heapy中,它只能描述纯Python对象。一种解决方案可能是调查valgrind来追踪你的内存泄漏。