首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在加载大对象后测量堆大小的增加

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

Stack Overflow用户
提问于 2013-07-02 10:51:32
回答 2查看 1.1K关注 0票数 7

我感兴趣的是,当加载一个大对象时,python堆的总大小是如何增加的。heapy似乎是我所需要的,但我不理解结果。

我有一个350MB的pickle文件,其中包含一个pandas DataFrame,其中包含大约250万个条目。当我加载该文件并随后使用heapy检查堆时,它报告只有大约8MB的对象添加到堆中。

代码语言:javascript
复制
import guppy
h = guppy.hpy()
h.setrelheap()
df = pickle.load(open('test-df.pickle'))
h.heap()

这将产生以下输出:

代码语言:javascript
复制
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 bytesTotal size。那只有8MB。

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-07-02 19:25:42

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

代码语言:javascript
复制
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
票数 1
EN

Stack Overflow用户

发布于 2014-07-04 21:30:21

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17416669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档