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

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)
    
  • 增加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:45:04