3.6GB CSV加载到pandas占用超64GB内存的原因及优化方案问询
pandas加载3.6GB CSV内存超出64GB问题说明与解决方案
问题成因
该问题和设备故障无关,核心是CSV磁盘存储和pandas内存存储的差异,结合你的数据特征导致的,具体原因如下:
- CSV是纯文本压缩存储格式,加载到内存后会转为pandas内部存储结构,内存占用本身就会远高于磁盘体积,通常是磁盘体积的3~5倍,极端场景可达10倍以上。
- 你的数据集属于典型宽表,共4247列,其中3112列为
object类型:64位系统下pandas的object类型每个值存储的是8字节指针,加字符串本身的存储开销,比磁盘上的原始文本占用大很多。 - pandas默认会为数值列分配最高精度的
int64/float64类型,很多场景下数据范围不需要这么高的精度,会造成不必要的内存浪费。 - 若整数列存在空值,pandas默认会将其转为
float64存储,进一步拉高内存占用。
全量加载优化方案
方案1:指定dtype加载(改动力度最小)
读文件时手动指定列类型,压缩内存占用:
- 对唯一值占比远低于总行数的
object列,指定为category类型,内存占用可降低90%以上。 - 对数值列使用更小精度的类型,比如用
int32/int16代替int64,float32代替float64,只要满足业务精度要求即可。
示例代码:
# 可先基于采样数据获取各列推荐dtype,再传入read_csv dtype_dict = {} # 示例:将所有object列设为category,数值列做精度压缩 sample_df = pd.read_csv('../input/ML_DATA.csv', nrows=10000) for col in sample_df.columns: if sample_df[col].dtype == 'object': dtype_dict[col] = 'category' elif str(sample_df[col].dtype).startswith('int'): dtype_dict[col] = 'int32' # 可根据实际数值范围调整为int16/int8 elif str(sample_df[col].dtype).startswith('float'): dtype_dict[col] = 'float32' # 精度要求低的话可进一步调整 df = pd.read_csv('../input/ML_DATA.csv', dtype=dtype_dict)
方案2:使用更高性能的加载库
换用Polars库加载CSV,其对宽表的内存管理远优于pandas,加载完成后再转pandas DataFrame即可,改动力度极小:
import polars as pl # Polars直接读取csv内存占用比pandas低50%以上 df = pl.read_csv('../input/ML_DATA.csv').to_pandas()
方案3:分块加载后合并
如果上述方案仍无法满足需求,可通过分块加载降低内存峰值,每块先做内存优化再合并:
chunk_list = [] # 按需调整分块大小,数值越大加载越快,内存峰值越高 for chunk in pd.read_csv('../input/ML_DATA.csv', chunksize=10000): # object列转category for col in chunk.select_dtypes(include='object').columns: if chunk[col].nunique() / len(chunk) < 0.2: # 唯一值占比低于20%转分类,可自行调整阈值 chunk[col] = chunk[col].astype('category') # 压缩数值类型精度 int_cols = chunk.select_dtypes(include='int64').columns chunk[int_cols] = chunk[int_cols].apply(pd.to_numeric, downcast='integer') float_cols = chunk.select_dtypes(include='float64').columns chunk[float_cols] = chunk[float_cols].apply(pd.to_numeric, downcast='float') chunk_list.append(chunk) df = pd.concat(chunk_list, ignore_index=True)
设备故障排查
该场景下设备故障的概率几乎为0,不用排查硬件问题,优先调整加载策略即可。
内容的提问来源于stack exchange,提问作者justanewb
相关产品推荐
相关产品推荐

