有人可以详细说明调用 DataFrame 的 memory_usage 方法时参数 deep=True 的作用吗?我从文档中了解到,它“钻取”到具有对象数据类型的列,以查看这些值实际占用内存的量。但什么是“正确”的值呢?DataFrame 实际上占用了我多少内存?
我在 DataFrame 的磁盘上加载了一个大约 2GB 的文件df。如果没有深度,我感觉我有正确的值,因为我得到了接近文件大小的东西。...我得到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
Run Code Online (Sandbox Code Playgroud)
如果我在任务管理器中查看 python 程序使用的内存,我会看到一个值从 250MB 到大约 1.87GB 不等(与 相同deep=False)。这是否意味着我的列在不使用时会从内存中“释放”,并且如果我使用所有列,总内存使用量可能会达到 宣布的 13.9 GB deep=True?
这种差异是由于任何包含字符串或对象的列造成的。Pandas 将字符串视为对象,df.memory_usage()默认情况下不考虑对象的大小deep=False。您必须指定deep=True才能更准确地测量包含字符串或对象的任何 DataFrame 的大小。
我的 DataFrame 有 560,897 行和 1 列,每行有 38 个字符串。df.memory_usage()该列返回 4,487,176 字节,即每个字符串 8 字节。然而,38 个字符的字符串不能仅用 8 个字节来存储。df.memory_usage(deep=True)返回 53,285,215 字节。每个字符串有 95 个字节,仅比 Python 中单个内置字符串变量的大小稍多。
同一数据帧中的列dtype=int32返回 2,243,588 字节,无论是否deep = True,也无论每个整数的值。
这里也有很好的解释: https ://pythonspeed.com/articles/pandas-dataframe-series-memory-usage/