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

在Pandas中加载大型CSV文件内存占用过高的解决方案求助

解决Pandas加载CSV内存占用过高的实用方案

我之前也碰到过一模一样的情况——明明CSV只有几百MB,Pandas一加载内存直接飙到几个G,甚至触发内存错误,太闹心了!结合我踩过的坑,给你几个亲测有效的解决思路,按优先级来试试:

1. 手动指定数据类型(最有效且易操作)

Pandas默认的类型推断经常会“过度分配”内存:比如把小整数推断成int64,把字符串默认存成object类型(每个元素都是独立的指针,巨占内存)。手动指定更紧凑的类型能直接砍半甚至更多内存占用:

  • 对于整数列:如果数值范围不大,用int32/int16代替默认的int64;如果有缺失值,用Pandas的nullable类型Int32(注意大写I)
  • 对于字符串列:如果类别数量远少于行数(比如性别、状态这类),改用category类型;如果是长文本但不需要类别操作,用Pandas 1.0+支持的string类型(比object更高效)
  • 对于浮点列:用float32代替float64(如果精度允许)

示例代码:

import pandas as pd

# 先加载1000行样本,查看当前列类型,方便我们指定
sample_df = pd.read_csv('your_file.csv', nrows=1000)
print(sample_df.dtypes)

# 自定义类型映射
dtype_map = {
    "user_id": "int32",
    "status": "category",
    "age": "Int32",  # 支持缺失值的整数类型
    "description": "string"
}

# 用指定类型加载CSV
df = pd.read_csv('your_file.csv', dtype=dtype_map)

2. 只加载需要的列

如果你的分析不需要用到CSV里的所有列,直接用usecols参数筛选要加载的列,内存占用会直接按比例下降:

# 只加载分析需要的3列
df = pd.read_csv('your_file.csv', usecols=['user_id', 'age', 'status'], dtype=dtype_map)

3. 优化Chunk Size的使用方式

你提到已经试过chunk size但没解决问题,大概率是处理chunk时没有及时释放内存(比如把所有chunk存在列表里,相当于还是加载了全量数据)。正确的做法是处理一个chunk就输出/聚合,然后立刻释放内存:

chunk_size = 50_000  # 根据你的内存调整大小
total_sales = 0

for chunk in pd.read_csv('your_file.csv', chunksize=chunk_size, dtype=dtype_map):
    # 对当前chunk做计算,比如累加销售额
    total_sales += chunk['sales'].sum()
    # 手动删除chunk,让垃圾回收器回收内存
    del chunk

print(f"总销售额:{total_sales}")

4. 转换为高效的列式存储格式

如果需要反复加载这个CSV,建议转成Parquet或Feather这类列式存储格式——它们自带压缩,加载速度快,内存占用远低于CSV:

# 先按指定类型加载CSV,然后转存为Parquet(需要安装pyarrow或fastparquet库)
df = pd.read_csv('your_file.csv', dtype=dtype_map)
df.to_parquet('your_data.parquet', compression='snappy')

# 后续直接加载Parquet文件,内存占用会大幅降低
df = pd.read_parquet('your_data.parquet')

5. 使用Dask处理超内存数据集

如果以上方法都不够,试试Dask DataFrame——它和Pandas API几乎兼容,会自动把数据分成小块处理,不需要一次性加载全量数据到内存:

import dask.dataframe as dd

# 用Dask加载CSV,参数和Pandas类似
ddf = dd.read_csv('your_file.csv', dtype=dtype_map)

# 执行计算时,Dask会自动分块处理
average_age = ddf['age'].mean().compute()
print(f"平均年龄:{average_age}")

另外可以检查下CSV里有没有异常数据,比如某列存了超长文本、重复的行,这些也会偷偷占用大量内存。如果有重复行,加载后用df.drop_duplicates()清理一下也能省不少内存。

内容的提问来源于stack exchange,提问作者Suman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:13:18