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

