为什么memory\u usage()和memory\u usage(deep=True)之间会有这样的差别?

2024-10-02 04:37:43 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能详细说明参数deep=True在调用数据帧的内存使用方法时的作用吗?我从doc中了解到,它“钻入”具有object dtype的列,以查看这些值在内存中的实际占用量。那么“正确”的价值是什么呢?数据帧实际占用了我多少内存?你知道吗

我在数据帧df的磁盘上加载了一个大约2GB的文件。没有深度,我觉得我有正确的价值,因为我得到了接近文件大小的东西。用deep=true。。。我得到这个值的7倍,我的电脑甚至没有足够的内存来容纳这个!你知道吗

>>> 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.9gb?你知道吗


Tags: 数据方法内存truedf参数usagesum
1条回答
网友
1楼 · 发布于 2024-10-02 04:37:43

我怎么理解呢,首先是documentation。你知道吗

它讨论的是字节,你需要理解字节是什么。我把Wikipedia page链接到你。现在,我们将以文档为例来理解它。您需要理解一个类型如何在低级语言中工作,例如C或C++(例如, INTEEE>,浮点,…)。你知道吗

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位)中。你知道吗

现在,对于其他列:int64float64表示有一个包含64位的整数,即8个字节。比之前的boolean值大8倍!如果我们看上面的df.memory_usage(),如果我们将bool列(5000)的memuse乘以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只能存储数字数据,但pandas可以存储几乎任何类型的数据,因为它包含iterationstrings组合。你知道吗

加载数据帧时,只需对数据进行第一次引用即可。当您不激活deep=True选项时,它不会搜索整个数据帧的用法,而是搜索它实际使用的是什么:这意味着对您的数据的第一个指针/引用(因为,非常简单地说,,第一个引用指向它所指向的数据,使用我们对这个引用的了解,我们知道下一个引用是),它是一个64位的数据,8字节的数据,不带deep=True选项的5000行的40000字节。你知道吗

相关问题 更多 >

    热门问题