7

我有兴趣找出加载大对象时python堆的总大小的增加。heapy 似乎是我需要的,但我不明白结果。

我有一个 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 sizeof 8694448 bytes。这只是 8 MB。

为什么不能Total size反映整体的大小DataFrame df

(使用 python 2.7.3、heapy 0.1.10、Linux 3.2.0-48-generic-pae (Ubuntu)、i686)

4

2 回答 2

1

您可以尝试pympler,上次检查时它对我有用。如果您只对总内存增加感兴趣,而不是对特定类感兴趣,您可以通过特定于操作系统的调用来获取使用的总内存。例如,在基于 unix 的操作系统上,您可以在加载对象之前和之后执行以下操作以获取差异。

resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
于 2013-07-02T11:25:42.223 回答
1

当我试图找出为什么我的 500 MB CSV 文件占用了高达 5 GB 的内存时,我遇到了类似的问题。Pandas 基本上建立在 Numpy 之上,因此使用 C malloc 来分配空间。这就是为什么它没有出现在 heapy 中,它只分析纯 Python 对象。一种解决方案可能是查看 valgrind 以追踪您的内存泄漏。

于 2014-07-04T13:30:21.277 回答