Pandas内存使用不一致性

6
我在使用 Pandas DataFrame 时遇到了一些内存不一致的问题。
这是我的代码框架:
import pandas as pd
import numpy as np

columns_dtype = {'A': np.int16, 'B': np.int8, ...}
df = pd.read_csv('my_file.csv', dtype=columns_dtype)

那基本上就是使用pandas读取CSV文件并控制列数据类型。但是,当我想知道我的程序分配了多少内存时,信息似乎不太一致。 信息1:
df.info(memory_usage='deep')

这给出了:内存使用:482.6 MB 信息2:
import dill, sys
sys.getsizeof(dill.dumps(df))

这是给出的结果:506049782(即 506 Mb)

信息 3:

分配给我的程序的 RAM 是:1.1 GiB(或 1.2 Gb)

附加信息(但我认为这不相关):

my_file.csv 的大小为 888 Mb(ls -lh)

问题:

由于我只是将 csv 文件加载到 Pandas DataFrame 对象中,为什么我的程序需要超过 1 Gb 的 RAM,而对象大小约为 0.5 Gb?

非常感谢


dill.dumps的相关性是什么?你认为为什么dill/pickle序列化的数据框会占用与原始数据框完全相同的内存空间? - juanpa.arrivillaga
不,我只是想检查腌制对象的数量级。它大约与pandas对象的大小相匹配,这意味着df.info(memory_usage='deep')不会低估pandas对象的大小。此外,sys.getsizeof(dill.dumps(df))和sys.getsizeof(df)是相同的。 - DareYang
因为解析CSV文件可能需要大量的辅助内存。请查看pd.read_csv选项。 - juanpa.arrivillaga
1个回答

2
我不会假装了解Pandas中动态内存用于保存数据的深层次用法。通常情况下,当Pandas加载大型平面文件时,它需要大量内存,作为经验法则,Pandas将使用5-10倍于您加载的文件大小的内存来进行分析。
为避免这些问题,您可以在加载数据时对数据进行分块:
  df = pd.load_csv(file_path, chunksize = 30000)

如果你是在列上进行分析的话,可以使用"最初的回答"。
  df = pd.load_csv(file_path, usecols = list_of_columns_index)

最初的回答,或者两者都可以!
  df = pd.load_csv(file_path, chunksize = 30000, usecols = list_of_columns_index)

希望这能加快你的分析速度。最初的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接