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

Python转换超大CSV为Parquet时pd.read_csv报内存不足的解决方法

全量加载CSV触发OOM的核心原因是pandas默认将整个文件载入内存,只要改用流式读写的思路,不需要全量加载即可完成格式转换,以下是经过验证的可行方案:

方案1:pandas分块读写(无需安装额外依赖)

利用pandas原生的分块读取能力,每次仅加载指定行数的数据到内存,处理写入完成后立即释放内存,可根据自身内存大小调整单次读取的行数。

import pandas as pd

csv_path = '/kaggle/input/amex-default-prediction/train_data.csv'
parquet_path = '/kaggle/input/amex-default-prediction/train.parquet'

# 单次读取10万行,内存充足可以调大该值,内存紧张则调小
csv_chunk_reader = pd.read_csv(csv_path, chunksize=100000)
# 写入第一个数据块,初始化Parquet文件
first_chunk = next(csv_chunk_reader)
first_chunk.to_parquet(parquet_path, index=False)
# 遍历剩余数据块,追加写入Parquet
for chunk in csv_chunk_reader:
    chunk.to_parquet(parquet_path, index=False, append=True)

注意:如果CSV存在字段类型不统一的情况(比如同一列既存数字又存字符串),需要在read_csv中通过dtype参数提前为对应字段指定统一类型,否则追加写入时会触发类型不匹配错误。

方案2:DuckDB一键转换(性能最优,内存占用最低)

DuckDB为内嵌式分析引擎,内置自动流式读写、内存管控能力,不需要手动做分块处理,对TB级大文件兼容性好,转换速度是pandas的数倍。

import duckdb

duckdb.sql("""
COPY (
    SELECT * FROM read_csv_auto('/kaggle/input/amex-default-prediction/train_data.csv')
) TO '/kaggle/input/amex-default-prediction/train.parquet'
(FORMAT PARQUET)
""")

read_csv_auto会自动推断字段类型、处理空值和异常格式数据,不需要手动配置表结构,适配性更强。

方案3:Polars懒加载转换

Polars的懒执行模式会自动做查询计划优化,通过流式扫描+落盘的方式完成转换,内存占用远低于pandas,转换效率更高。

import polars as pl

pl.scan_csv('/kaggle/input/amex-default-prediction/train_data.csv') \
  .sink_parquet('/kaggle/input/amex-default-prediction/train.parquet')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:39:23