如何加载大量数据用于机器学习模型训练?大CSV读取内核冻结如何解决
大型CSV数据集加载优化方案
2GB CSV读取卡死通常是默认参数下内存占用过高触发了系统交换内存(swap)读写,可通过以下方案解决:
1. 优化pd.read_csv()原生参数
- 只加载需要的列:用
usecols参数指定你实际需要用到的字段,200余列大概率不会全用到,跳过无关列能大幅减少内存占用、提升读取速度,示例代码:df = pd.read_csv("your_file.csv", usecols=["col1", "col2", "col3"]) - 手动指定列数据类型:默认pandas会自动推断类型,很多时候会把数值型字段存为占用更高的int64/float64,或者把低基数的字符串存为object类型,可通过
dtype参数手动指定,比如把分类字段设为'category'类型,数值型根据取值范围设为int32/float32,示例:df = pd.read_csv("your_file.csv", dtype={"category_col": "category", "num_col": "int32"}) - 分块读取:用
chunksize参数把文件拆成多个小数据块逐块处理,不需要一次性把全量数据加载到内存,适合需要全量数据但内存不足的场景,示例:chunk_size = 10000 # 每次加载1万条,可根据内存大小调整 for chunk in pd.read_csv("your_file.csv", chunksize=chunk_size): # 对每个chunk单独做数据处理,比如过滤、聚合等 process(chunk) - 关闭不必要的自动推断:如果数据里不需要解析日期,添加
parse_dates=False关闭日期自动解析;如果有自定义的缺失值标识,用na_values指定避免异常推断消耗性能。
2. 换用更高性能的读取工具
- 用
polars库读取:polars是基于Rust开发的高性能数据分析库,内存效率和读取速度远高于pandas,支持惰性加载,不需要全量载入内存就能做数据处理,也兼容pandas接口,读取示例:import polars as pl # 读取后转pandas DataFrame df = pl.read_csv("your_file.csv").to_pandas() # 不需要转pandas的话直接用polars处理性能会更高 - 用
modin库替换pandas:modin可以自动并行化读取操作,接口和pandas完全一致,只需要替换导入语句即可,不需要修改其他业务代码,示例:import modin.pandas as pd df = pd.read_csv("your_file.csv")
3. 预处理为高效存储格式
如果后续需要频繁读取这个文件,可以先把文件转成列式存储的二进制格式,比如Parquet或者Feather,这两种格式压缩率高,读写速度是CSV的数倍到数十倍,第一次读取分块转存后,后续直接读二进制文件即可,转存示例:
# 分块读CSV转存为Parquet格式 for i, chunk in enumerate(pd.read_csv("your_file.csv", chunksize=10000)): chunk.to_parquet("output.parquet", append=True if i>0 else False) # 后续直接读取Parquet文件,速度可提升数十倍 df = pd.read_parquet("output.parquet")
内容的提问来源于stack exchange,提问作者Jiberellin
相关产品推荐
相关产品推荐

