我在Ubuntu 16.10上使用numpy(1.13.1)和pandas(0.20.3)和python 2.7或3.5(两者都有相同的问题)。
我正在调查大熊猫内存处理(特别是当它复制或不复制数据时)并遇到了一个我不明白的重要内存问题。虽然我已经看到(很多)人们对其内存性能的其他问题,但我还没有找到任何直接解决这个问题的问题。
具体来说,pandas会分配比我要求更多的很多内存。当我尝试使用特定大小的列分配DataFrame时,我注意到了一些非常奇怪的行为:
import pandas as pd, numpy as np
GB = 1024**3
df = pd.DataFrame()
df['MyCol'] = np.ones(int(1*GB/8), dtype='float64')
当我执行此操作时,我看到我的python进程实际分配了6GB内存,(如果我要求2GB则为12G,如果我要求3GB则为21GB,如果我要求4GB,我的计算机会中断: - /)而不是1GB是预期的。我想起初可能Python正在进行一些积极的预分配,但是如果我只构建numpy数组本身,我每次都会得到多少内存,无论是1GB,10GB,25GB等等。
此外,更有趣的是如果我稍微改变代码:
df['MyCol'] = np.ones(int(1*GB), dtype='uint8')
它分配了如此多的内存,导致我的系统崩溃(单独运行numpy调用正确分配1GB内存)。 (编辑2017/8/17 :出于好奇,我今天尝试使用更新版本的pandas(0.20.3)和numpy(1.13.1),以及RAM升级到64GB。并运行此命令仍然中断,分配所有64(ish)GB的可用RAM 。)
如果pandas制作副本并且可能会分配另一列来存储索引,我可以理解要求内存加倍甚至三倍,但我无法解释它实际上在做什么。粗略地看一下代码也不是很清楚。
我尝试用几种不同的方式构建数据框,所有这些都具有相同的结果。鉴于其他人成功地使用这个软件包进行大数据分析,我不得不假设我做了一些非常错误的事情,尽管从文档中我可以看出这应该是正确的。
思想?
一些补充说明:
答案 0 :(得分:0)
所以我创建了一个8000字节的数组:
// override object.Equals
public override bool Equals(object obj)
{
//
// See the full list of guidelines at
// http://go.microsoft.com/fwlink/?LinkID=85237
// and also the guidance for operator== at
// http://go.microsoft.com/fwlink/?LinkId=85238
//
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var data = (accessoire)obj;
return this.Ref.Equals(data.Ref);
}
// override object.GetHashCode
public override int GetHashCode()
{
return this.Ref.GetHashCode()
}
因此数据为8k,索引为8k。
我添加了一列 - 使用量增加In [248]: x=np.ones(1000)
In [249]: df=pd.DataFrame({'MyCol': x}, dtype=float)
In [250]: df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000 entries, 0 to 999
Data columns (total 1 columns):
MyCol 1000 non-null float64
dtypes: float64(1)
memory usage: 15.6 KB
的大小:
x