如何用Python Pandas高效加载Parquet文件列表?
Pandas加载Parquet文件的性能差异分析与优化技巧
一、pd.read_parquet("/path/to/directory/")提速的核心原理
直接读取目录时,Pandas依赖的底层Parquet引擎(PyArrow或FastParquet)会做以下关键优化:
- 批量元数据扫描:一次性遍历目录下所有文件,统一读取schema、分区等元数据,避免了逐个文件读取元数据的重复开销。
- 并行化处理:引擎会自动启用多线程/进程并行加载文件,充分利用CPU和IO资源;而列表推导式逐个读取是单线程执行,完全没用到并行能力。
- 减少内存拷贝:批量读取可以直接将所有文件的数据合并为一个完整的DataFrame,避免了逐个读取后
pd.concat带来的多次内存分配、扩容和数据拷贝操作。
二、优化pd.concat([pd.read_parquet(i) for i in filelist])的技巧
要让第二种方法接近第一种的性能,可以从以下几个方向入手:
1. 直接给pd.read_parquet传入过滤后的文件列表(推荐)
Pandas 1.5.0+版本支持直接向pd.read_parquet传入文件列表,底层会调用引擎的批量读取逻辑,和直接读目录的性能一致:
import glob import pandas as pd filelist = glob.glob("/path/to/directory/*") # 自定义过滤逻辑,比如只保留包含特定关键词的文件 filtered_files = [f for f in filelist if "2023" in f] df = pd.read_parquet(filtered_files)
如果需要从多个目录加载,只需把不同目录的文件合并到同一个列表中即可。
2. 用底层引擎的批量读取接口
如果使用PyArrow引擎,直接调用pyarrow.parquet.read_table传入文件列表,再转换为Pandas DataFrame,性能会更优:
import glob import pyarrow.parquet as pq from pyarrow import pandas as pa_pd filelist = glob.glob("/path/to/directory/*") filtered_files = [f for f in filelist if ...] # 你的过滤条件 table = pq.read_table(filtered_files) df = pa_pd.to_pandas(table)
这种方式完全复用了引擎的并行优化,和直接读目录的性能几乎无差异。
3. 并行化读取单个文件
如果必须逐个处理文件(比如每个文件需要自定义读取逻辑),可以用线程池实现并行读取:
import glob import pandas as pd from concurrent.futures import ThreadPoolExecutor def read_parquet_file(file_path): # 这里可以添加自定义逻辑,比如特定列读取、过滤等 return pd.read_parquet(file_path, columns=["col1", "col2"]) filelist = glob.glob("/path/to/directory/*") filtered_files = [f for f in filelist if ...] with ThreadPoolExecutor(max_workers=4) as executor: dfs = list(executor.map(read_parquet_file, filtered_files)) df = pd.concat(dfs, ignore_index=True)
Parquet读取属于IO密集型任务,线程池足够提升效率;如果是CPU密集型的自定义处理,可以改用ProcessPoolExecutor。
4. 利用分区路径预过滤
如果你的Parquet文件是按目录分区存储的(比如/data/year=2023/month=10/),直接通过路径过滤分区文件,比全量读取后过滤更高效:
import pandas as pd import glob # 只加载2023年10月的所有Parquet文件 filtered_files = glob.glob("/path/to/directory/year=2023/month=10/*") df = pd.read_parquet(filtered_files)
这种方式从源头减少了需要加载的文件数量,性能提升最为显著。
内容的提问来源于stack exchange,提问作者djmac
相关产品推荐
相关产品推荐

