如何快速将JSON文件导入pandas DataFrame 优化大文件读取效率
500万行级pandas数据集读写优化
首先说你原有JSON方案速度慢的核心原因:
- 写JSON时加了
indent=1参数,会生成带缩进的格式化JSON,文件体积比无缩进紧凑格式大30%以上,平白增加磁盘IO开销;再加上使用orient='records'模式,每一行数据都会重复携带所有字段名,500万行数据下仅重复字段名就可能占用数GB空间,文件体积可达同数据CSV的2-3倍,解析时还要反复匹配重复字段,速度自然和读CSV没有明显差距。 - pandas自带的
read_json为单线程解析逻辑,没有针对超大文件做专项优化,本身解析效率就不高。
优先选择二进制存储格式,速度比CSV/JSON快一个数量级
不建议在百万级以上数据集场景使用JSON做存储格式,pandas生态下有专为大数据设计的二进制列存格式,500万行数据通常数秒即可加载完成,是目前效率最高的方案:
- Parquet格式:通用列存压缩格式,压缩率高,支持按列读取、并行解析,适合长期存储、跨语言协作使用,需要提前安装
pyarrow或fastparquet依赖:
# 存储为Parquet文件 dfcustdata.to_parquet('custdata.parquet', engine='pyarrow', compression='snappy') # 读取到DataFrame df = pd.read_parquet('custdata.parquet', engine='pyarrow')
- Feather格式:基于Apache Arrow的内存映射格式,读写速度比Parquet更快,适合本地开发时反复加载的中间数据集,缺点是压缩率略低于Parquet:
# 存储为Feather文件 dfcustdata.to_feather('custdata.feather') # 读取到DataFrame df = pd.read_feather('custdata.feather')
- Pickle格式:pandas原生支持的序列化格式,调用简单读写速度快,但跨Python、pandas版本兼容性差,仅适合临时缓存使用,不建议做长期存储。
必须使用JSON格式的参数优化方案
如果业务要求必须存储为JSON格式,调整以下配置可以将读写速度提升2-3倍:
- 去掉
indent参数,存储无缩进的紧凑JSON,减小文件体积 - 将
orient参数从records改为split,该模式会将列名、索引、数据分开存储,没有重复字段的冗余信息,文件更小解析速度更快 - 读取时换用
orjson、ujson这类第三方高性能JSON解析库,效率远高于pandas自带的解析器
优化后的代码示例:
import orjson # 存储优化后的JSON文件 dfcustdata.to_json('custdata.json', orient='split') # 读取文件 with open('custdata.json', 'rb') as f: json_data = orjson.loads(f.read()) df = pd.DataFrame(json_data['data'], columns=json_data['columns'], index=json_data['index'])
CSV读取的优化补充
你找到的分块读取方法主要作用是解决大文件读入时内存溢出的问题,对读取速度提升有限,要进一步加快CSV读取效率可以做两处调整:
- 读取时手动指定
dtype参数,给每一列明确匹配的数据类型(比如类别型字段设为category,数值型字段选择满足精度的最小类型如int8、int32),省掉pandas自动逐块推断类型的开销,速度可提升30%以上 - 将默认的C解析引擎更换为
pyarrow引擎,解析速度可提升1-2倍
优化后的代码示例:
# 根据自身数据集的实际字段调整类型映射 dtype_config = { "cust_id": "int32", "cust_level": "category", "balance": "float32" } df = pd.read_csv('custdata.csv', dtype=dtype_config, engine='pyarrow')
如果遇到内存不足的场景仍然可以使用分块读取逻辑,注意chunksize不需要设为2000这么小,可以根据机器内存大小调整到10万-100万区间,过小的块大小会导致频繁拼接,反而拖慢整体速度。
内容的提问来源于stack exchange,提问作者seraphis
相关产品推荐
相关产品推荐

