解析6000个CSV文件遇内存不足,求60GB数据集合并ML训练方案
解决60GB CSV文件合并的内存友好方案
方案1:逐行读写(最直接的内存友好方式)
全程不加载整个文件到内存,仅逐行读取写入,避免内存耗尽。核心逻辑是保留第一个文件的表头,后续文件跳过表头后逐行追加。
import os csv_files = ["file1.csv", "file2.csv", ...] # 替换为你的文件列表 output_file = "bigdata.csv" # 写入第一个文件的完整内容(包含表头) with open(output_file, "w", encoding="utf-8") as out_f: if csv_files: with open(csv_files[0], "r", encoding="utf-8") as first_f: out_f.write(first_f.read()) # 处理剩余文件,跳过表头后逐行写入 for f in csv_files[1:]: print(f"处理文件:{f}") with open(f, "r", encoding="utf-8") as in_f: next(in_f) # 跳过第一行表头 for line in in_f: out_f.write(line)
注意:如果CSV无表头或表头格式不统一,需调整逻辑(比如统一写入自定义表头)。
方案2:Pandas分块读取+追加写入
如果后续要衔接Pandas的ML训练流程,可分块读取每个CSV,逐块写入目标文件,既保留数据处理能力,又不占满内存。
import pandas as pd csv_files = ["file1.csv", "file2.csv", ...] output_file = "bigdata.csv" first_file = True for f in csv_files: print(f"处理文件:{f}") # 按10000行分块,chunksize可根据内存情况调整 for chunk in pd.read_csv(f, chunksize=10000): if first_file: chunk.to_csv(output_file, index=False, mode="w") first_file = False else: chunk.to_csv(output_file, index=False, mode="a", header=False)
方案3:命令行工具(Linux/macOS环境)
用shell命令直接合并,速度更快,完全不占用Python内存:
# 提取第一个文件的表头,再追加所有文件的内容(跳过每个文件的表头) head -n 1 file1.csv > bigdata.csv && tail -q -n +2 *.csv >> bigdata.csv
注意:文件名含特殊字符时,需先整理文件列表避免命令出错。
ML训练额外建议
若合并后文件仍过大,无法直接加载训练:
- 用Dask替代Pandas,它支持分块处理大型数据集,API与Pandas兼容,适合并行化ML训练。
- 将合并后的CSV转为Parquet格式,压缩比更高且支持列存储,后续训练可仅加载所需列,大幅节省内存。
内容的提问来源于stack exchange,提问作者Kost1k
相关产品推荐
相关产品推荐

