pandas读取2亿行大CSV报内存错误,需单DataFrame全量分析如何解决
超大CSV读取内存错误解决方案
一、优化pandas.read_csv参数降低内存占用
- 显式指定列类型
dtype:报错提示数据类型为object是内存占用过高的核心原因,提前为每列指定更紧凑的类型可减少50%以上内存占用:- 基数<50%的字符串列指定为
category类型 - 数值列根据取值范围用
int8/int16/int32/float32替代默认的int64/float64 - 纯字符串列用
pd.StringDtype()替代默认object类型
示例代码:
dtype_config = { "user_id": "int32", "category_col": "category", "text_col": pd.StringDtype(), "value": "float32" } csv_filename = pd.read_csv('filename.txt', sep="\t", error_bad_lines=False, dtype=dtype_config) - 基数<50%的字符串列指定为
- 增加
usecols参数,仅加载后续分析需要的列,跳过无关列直接减少待加载数据量。 - 关闭不必要的自动解析:非必要不开启
parse_dates,如果需要解析日期可搭配infer_datetime_format=True提升效率降低内存占用。
二、分块读取后合并为全量DataFrame
用chunksize参数分批读取文件,每批做完内存优化后暂存,最后合并为单个DataFrame,避免一次性加载全量数据占满内存:
import pandas as pd import gc chunk_list = [] # 可根据内存大小调整单次读取行数,建议单次读取占可用内存10%-20% chunk_size = 1000000 dtype_config = {} # 替换为你的列类型配置 use_cols = [] # 替换为你需要的列名 for chunk in pd.read_csv('filename.txt', sep="\t", error_bad_lines=False, dtype=dtype_config, usecols=use_cols, chunksize=chunk_size): # 可在此处对单批次数据做清洗、去重等预处理,进一步减少内存占用 chunk_list.append(chunk) # 合并所有分块为全量DataFrame full_df = pd.concat(chunk_list, axis=0, ignore_index=True) # 回收临时变量内存 del chunk_list gc.collect()
三、使用更低内存占用的读取方案
- 用PyArrow读取csv:PyArrow的csv解析器内存占用比pandas默认C引擎低30%以上,速度更快,读取后可直接转pandas DataFrame:
from pyarrow import csv import pyarrow as pa # 可自定义列类型 convert_options = csv.ConvertOptions( column_types={ "col1": pa.int32(), "col2": pa.string() } ) table = csv.read_csv('filename.txt', parse_options=csv.ParseOptions(delimiter="\t"), convert_options=convert_options) full_df = table.to_pandas() - 用Modin替换原生pandas:接口和pandas完全一致,无需修改业务代码,自动做并行读取和内存优化,内存管理效率远高于原生pandas,仅需修改导入语句:
# 先安装modin和ray:pip install modin[ray] import modin.pandas as pd # 后续read_csv代码和原来完全一致,自动优化内存占用
四、额外优化技巧
- 读取完成后用
full_df.info(memory_usage='deep')查看各列内存占用,针对性调整类型进一步压缩。 - 若仍有内存缺口,可临时调高系统虚拟内存,虽然会降低读写速度但可避免内存报错。
内容的提问来源于stack exchange,提问作者Tyler Moore
相关产品推荐
相关产品推荐

