当前位置: 首页 > 知识库问答 >
问题:

如何估计熊猫的数据帧需要多少内存?

严兴言
2023-03-14

我一直在想...如果我正在读取,比方说,一个400MB的csv文件到熊猫数据帧(使用read_csv或read_table),有没有办法猜测这需要多少内存?只是想更好地感受数据帧和内存...

共有3个答案

海叶秋
2023-03-14

我想我会带来更多的数据来讨论。

我对这个问题进行了一系列测试。

通过使用pythonresource包,我获得了进程的内存使用情况。

通过将csv写入StringIO缓冲区,我可以轻松地测量它的大小(以字节为单位)。

我做了两个实验,每个实验创建了20个数据帧,大小在10000到1000000行之间。两者都有10列。

在第一个实验中,我只在数据集中使用了浮点。

与csv文件相比,内存是如何随着行数的增加而增加的。(大小以兆字节为单位)

在第二个实验中,我采用了相同的方法,但数据集中的数据只包含短字符串。

csv的大小和数据帧的大小之间的关系似乎变化很大,但内存中的大小总是会大2-3倍(对于本实验中的帧大小)

我很想用更多的实验来完成这个答案,如果你想让我尝试一些特别的东西,请评论。

季华茂
2023-03-14

下面是不同方法的比较-sys。getsizeof(df)是最简单的。

在这个例子中,df是一个包含814行,11列(2 int,9个对象)的数据框-从一个427kb的shapefile中读取

>>> import sys
>>> sys.getsizeof(df)
(gives results in bytes)
462456
>>> df.memory_usage()
...
(lists each column at 8 bytes/row)

>>> df.memory_usage().sum()
71712
(roughly rows * cols * 8 bytes)

>>> df.memory_usage(deep=True)
(lists each column's full memory usage)

>>> df.memory_usage(deep=True).sum()
(gives results in bytes)
462432

打印数据帧信息到标准输出。从技术上讲,这些是千字节(KiB),而不是千字节——正如docstring所说,“内存使用情况以人类可读单位(base-2表示)显示。”所以得到的字节会乘以1024,例如。451.6 KiB=462,438字节。

>>> df.info()
...
memory usage: 70.0+ KB

>>> df.info(memory_usage='deep')
...
memory usage: 451.6 KB
汪凌
2023-03-14

df。memory_usage()将返回每列占用的字节数:

>>> df.memory_usage()

Row_ID            20906600
Household_ID      20906600
Vehicle           20906600
Calendar_Year     20906600
Model_Year        20906600
...

要包含索引,请传递index=True

因此,要获得整体内存消耗:

>>> df.memory_usage(index=True).sum()
731731000

此外,传递深层=True将启用更准确的内存使用情况报告,该报告说明了包含对象的全部使用情况。

这是因为如果deep=False(默认情况),内存使用不包括非数组组件的元素所消耗的内存。

 类似资料:
  • 假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是:

  • 我有一个需要一个数据帧作为输入的计算。我想对存储在扩展到51GB的netCDF文件中的数据运行此计算-目前,我一直在使用打开文件,并使用块(我的理解是,此打开的文件实际上是一个dask数组,因此一次只能将数据块加载到内存中)。但是,我似乎无法利用这种延迟加载,因为我必须将xarray数据转换为pandas数据帧才能运行我的计算——我的理解是,在这一点上,所有数据都加载到内存中(这是不好的)。 所以

  • 我有一个csv文件列表,我使用 我目前正在尝试遍历csv列表,并使用方法将axis参数设置为1,以按列将所有数据帧添加到一起。 它是工作的希望,但我遇到的问题,因为所有的数据帧都有相同的冒号名称,当我连接他们我得到例如10列都与关键"日期" 不管怎样,我能给哥伦布起个独一无二的名字吗?比如伦敦约会,柏林约会?显然,这些名称基于数据帧的名称。

  • 我有这个熊猫数据框 这就给了我: 我该怎么办 做一个新的人物, 将标题添加到图"标题这里" 以某种方式创建一个映射,这样标签不是29,30等,而是“29周”,“30周”等。 将图表的较大版本保存到我的计算机(例如10 x 10英寸) 这件事我已经琢磨了一个小时了!

  • 我在Python中使用一个视频游戏的熊猫DataFrame,每个游戏都有一种类型。我正在尝试删除任何在DataFrame中出现次数少于一定次数的类型的视频游戏,但我不知道该怎么做。我确实发现了一个StackOverflow问题,这个问题似乎是相关的,但我根本无法破译这个解决方案(可能是因为我从未听说过R,而且我对函数编程的记忆充其量也很生疏)。 帮助?

  • 我想在我的数据的每一列中找到< code>NaN的数目。