在调用DataFrame的memory_usage方法时,有人可以详细说明deep = True参数做什么吗?我从文档中了解到,它“钻取”具有对象dtype的列,以查看实际值在内存中的占用量。但是,“正确”的价值是什么? DataFrame实际占用我多少内存?
我在DataFrame df
中的磁盘上加载了大约2GB的文件。没有深深的了解,我就拥有正确的价值,因为我得到的东西接近文件的大小。使用deep=true
...,我得到的值是此值的7倍,而我的PC甚至没有足够的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?
答案 0 :(得分:1)
我怎么理解的,首先是documentation。
它讨论了字节,并且您需要了解什么是字节。我将Wikipedia page链接到您。现在,我们将以文档为例并对其进行理解。您需要了解类型在较低级别的语言(例如C或C ++)(例如, int , float )中如何工作的一点点。 ,...)。
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(假)或1(真)。它会存储在一个字节(8位)中。
现在,对于其他列:int64
和float64
表示您具有一个包含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
从技术上讲是一堆东西。熊猫基本上是numpy
的抽象形式,用于容纳任何类型的对象,因此,它被广泛使用。 Numpy只能存储数字数据,但是大熊猫可以存储几乎任何类型,因为它包含iteration
和strings
的组合。
在加载DataFrame时,您只需对数据进行首次引用即可使用它。而且,当您不激活deep=True
选项时,它不会搜索WHOLE DataFrame的用法,但实际上是在使用什么:意味着对数据的第一个指针/引用(因为,< strong>简而言之,第一个引用指向它指向AND的数据,利用我们对该引用的了解,我们知道下一个引用将在哪里),这是一个64位数据,所以8个字节的数据,所以40000
个字节代表5000行,而没有deep=True
选项。