2013-07-02 45 views
6

我有兴趣了解大对象加载时python堆的总大小的增加。 heapy似乎是我需要的,但我不明白结果。在加载大对象后测量堆大小的增加

我有一个350 MB的泡菜文件,里面有一个熊猫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 
... 

什么混淆我是8694448 bytesTotal size。这只是8 MB。

为什么没有Total size反映整个尺寸DataFramedf

(使用Python 2.7.3,heapy 0.1.10,Linux的3.2.0-48 - 仿制PAE(Ubuntu的),为i686)

回答

0

你可以尝试pympler,这为我工作的我最后一次检查。如果您只是对总内存增加感兴趣,而不是针对特定类,则可以通过操作系统特定的调用来获取所使用的总内存。例如,在基于Unix的操作系统上,可以在加载对象之前和之后执行类似下面的操作来获取diff。

resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 
+0

感谢您的回答。我还没有开始尝试使用益普乐 - 在接下来的几天内会试用它。操作系统对内存消耗的看法并不是我所感兴趣的,所以getrusage()对我来说无济于事。 – rodion

0

我有一个类似的问题,当我试图找出为什么我的500 MB CSV文件在内存中占用高达5 GB。熊猫基本上建立在Numpy之上,因此使用C malloc来分配空间。这就是为什么它不能在heapy中显示,它只能描述纯Python对象。一种解决方案可能是查看valgrind来追踪你的内存泄漏。