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

合并小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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:55:22