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

如何快速读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:45:38