Pandas使用的内存比

时间:2017-01-09 16:49:11

标签: python pandas numpy memory

我在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制作副本并且可能会分配另一列来存储索引,我可以理解要求内存加倍甚至三倍,但我无法解释它实际上在做什么。粗略地看一下代码也不是很清楚。

我尝试用几种不同的方式构建数据框,所有这些都具有相同的结果。鉴于其他人成功地使用这个软件包进行大数据分析,我不得不假设我做了一些非常错误的事情,尽管从文档中我可以看出这应该是正确的。

思想?

一些补充说明:

  1. 即使内存使用量很大,当调用memory_usage()时,pandas仍会(错误地)报告预期的数据大小(即如果我分配1GB数组,则报告1GB,即使实际已分配了6-10GB)。
  2. 在所有情况下,索引都很小(由mem​​ory_usage()报告,这可能不准确。)
  3. 释放pandas DataFrame(df = None,gc.collect())实际上并不释放所有内存。使用这种方法必须在某处发生泄漏。

1 个答案:

答案 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