在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
相关产品推荐
相关产品推荐

