You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:06:01