加载大对象后测量堆大小的增加

时间:2013-07-02 02:51:32

标签: python pandas heapy

我很想知道加载大对象时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)

2 个答案:

答案 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来追踪你的内存泄漏。