为什么memory_usage()和memory_usause(deep=True)之间有这样的区别



有人能详细说明参数deep=True在调用DataFrame的memory_use方法时的作用吗?我从文档中了解到,它"钻取"具有对象dtype的列,以查看这些值实际占用内存的量。但是,什么是"正确"的价值观呢?DataFrame实际占用了我多少内存?

我在DataFramedf中的磁盘上加载了一个大约2GB的文件。没有深度,我觉得我有正确的价值,因为我得到了接近文件大小的东西。使用deep=true。。。我得到了这个值的7倍,而我的电脑甚至没有足够的RAM来容纳这个!

>>> memus = df.memory_usage()
>>> memusdeep = df.memory_usage(deep=True)
>>> print(memus.sum() / 10**9, 'GB')
1.874067408 GB
>>> print(memusdeep.sum() / 10**9, 'GB') # that's very much!
13.897614776 GB

如果我在任务管理器中查看python程序使用的内存,我会看到一个从250MB到1.87GB不等的值(与deep=False相同)。这是否意味着我的列在不使用时会从内存中"释放",并且如果我使用所有列,则总内存使用量可能达到deep=True宣布的13.9 GB?

我如何理解它,首先是文档。

它讲的是字节,你需要了解什么是byte。我链接到维基百科页面。现在,我们将以文档为例来理解它。您需要了解类型在较低级别语言(如C或C++)中的工作方式(例如,intfloat…)。

dtypes = ['int64', 'float64', 'complex128', 'object', 'bool']
data = dict([(t, np.ones(shape=5000).astype(t))
for t in dtypes])
df = pd.DataFrame(data)
df.head()
#   int64  float64  complex128 object  bool
#0      1      1.0      (1+0j)      1  True
#1      1      1.0      (1+0j)      1  True
#2      1      1.0      (1+0j)      1  True
#3      1      1.0      (1+0j)      1  True
#4      1      1.0      (1+0j)      1  True
df.memory_usage(index=False)
#int64         40000
#float64       40000
#complex128    80000
#object        40000
#bool           5000

关于boolean,这是相当容易的。它有2种可能的状态,因此将保持0(false)或1(true)。它将被存储在一个字节(8位)中。

现在,对于其他列:int64float64意味着您有一个包含64位的整数,因此是8个字节。这是上一个boolean值的8倍!如果我们看上面的df.memory_usage(),如果我们将bool列(5000)的内存乘以8(字节),它确实回答了40000

相同的逻辑适用于complex128。128位等于16个字节,乘以5000列得到80000。memuse返回的数字。


哪里变得棘手

df['object'].memory_usage(index=False)
#40000
df['object'].memory_usage(index=False, deep=True)
#160000L

从技术上讲,大熊猫的object是一系列的东西。Pandas基本上是numpy的抽象,用于保存任何类型的对象,这就是它被广泛使用的原因。Numpy只能存储数字数据,但Panda可以存储几乎任何类型的数据,因为它包括iterationstrings

当你加载DataFrame时,你只需要对数据的第一个引用就可以使用它。当你不激活deep=True选项时,它不会搜索整个DataFrame的使用情况,但它实际使用的是什么:意味着指向数据的第一个指针/引用(因为非常简单地说,第一个引用指向它指向的数据AND,使用我们对这个引用的了解,我们知道下一个引用将在哪里),这是一个64位的数据,所以是8字节的数据,因此对于没有deep=True选项的5000行,是40000字节。

最新更新