合并小Parquet文件至大文件:内存高效方案求助
内存高效合并大量小Parquet文件的方案
以下是几种针对内存超限问题的解决方案,按实现复杂度和内存效率排序:
1. Pandas分批追加写入(最简单的内存优化)
不需要一次性加载所有DataFrame到内存,而是逐个读取文件并追加到目标Parquet文件,每次仅保留单个小文件的数据在内存中。
import pandas as pd import glob # 匹配所有待合并的Parquet文件 parquet_files = glob.glob("path/to/your/files/*.parquet") # 处理第一个文件,初始化目标文件 first_df = pd.read_parquet(parquet_files[0]) first_df.to_parquet("merged_output.parquet", engine="pyarrow") # 遍历剩余文件,追加写入 for file in parquet_files[1:]: df = pd.read_parquet(file) df.to_parquet("merged_output.parquet", engine="pyarrow", mode="append")
补充优化:读取文件时指定dtype压缩内存,比如将重复率高的字符串列设为category,或用更紧凑的数值类型:
dtype_config = {"category_column": "category", "int_column": "int32"} df = pd.read_parquet(file, dtype=dtype_config)
2. 使用Dask自动分块处理
Dask会自动将数据集拆分为内存可容纳的块,并行处理且延迟计算,完全避免一次性加载全量数据。
import dask.dataframe as dd # 读取所有Parquet文件(延迟加载) ddf = dd.read_parquet("path/to/your/files/*.parquet") # 写入合并后的文件,自动处理分块 ddf.to_parquet("merged_output.parquet", engine="pyarrow", write_index=False)
3. 直接用PyArrow操作(内存效率最高)
跳过Pandas DataFrame的转换,直接用PyArrow的ParquetWriter逐文件写入,PyArrow Table的内存占用比Pandas DataFrame更低。
import pyarrow.parquet as pq import glob parquet_files = glob.glob("path/to/your/files/*.parquet") # 获取第一个文件的Schema,保证后续文件格式一致 first_table = pq.read_table(parquet_files[0]) target_schema = first_table.schema # 创建Writer并逐文件写入 with pq.ParquetWriter("merged_output.parquet", target_schema) as writer: writer.write_table(first_table) for file in parquet_files[1:]: table = pq.read_table(file) writer.write_table(table)
内容的提问来源于stack exchange,提问作者Boss Boss
相关产品推荐
相关产品推荐

