如何快速读取bz2压缩包中的JSON文件并提升处理效率?
加速bz2压缩JSON文件读取与转DataFrame的方法
问题描述
我尝试打开bz2格式压缩文件并读取其中包含的JSON内容,当前的实现代码如下:
with bz2.open(bz2_file_path, 'rb') as f: json_content = f.read() json_df = pd.read_json(json_content.decode('utf-8'), lines = True)由于需要重复执行该流程多次,而
with代码块占用了大部分耗时,请问是否有方法可以加快该处理过程?
优化方案
1. 利用pandas原生支持压缩文件读取
pandas的read_json本身支持直接识别并读取bz2压缩文件,无需手动打开、读取和解码,内部会优化IO与解压流程,同时避免一次性加载整个文件到内存:
json_df = pd.read_json(bz2_file_path, lines=True, compression='bz2')
2. 并行处理多文件(针对批量重复场景)
如果是处理多个bz2文件,单文件循环效率较低,可通过多进程并行处理提升速度:
from concurrent.futures import ProcessPoolExecutor import pandas as pd def process_single_file(file_path): return pd.read_json(file_path, lines=True, compression='bz2') # 替换为你的文件列表 file_list = ["file1.bz2", "file2.bz2", "file3.bz2"] with ProcessPoolExecutor() as executor: df_list = list(executor.map(process_single_file, file_list)) # 按需合并结果 combined_df = pd.concat(df_list, ignore_index=True)
注意:进程数建议匹配CPU核心数,避免资源过载。
3. 调整bz2解压缓冲区大小
如果仍需手动操作文件对象,可增大缓冲区减少IO交互次数,提升解压效率:
import bz2 import pandas as pd # 设置10MB缓冲区(可根据文件大小调整) with bz2.open(bz2_file_path, 'rb', buffering=10*1024*1024) as f: json_df = pd.read_json(f, lines=True)
4. 转换为更高效的存储格式(长期优化)
若文件需频繁重复读取,可一次性将bz2文件转换为Parquet/Feather这类列式存储格式,后续读取速度会显著提升:
# 首次转换 json_df = pd.read_json(bz2_file_path, lines=True, compression='bz2') json_df.to_parquet('data.parquet') # 后续快速读取 json_df = pd.read_parquet('data.parquet')
内容的提问来源于stack exchange,提问作者baked goods
相关产品推荐
相关产品推荐

