Python中高效读取超大Parquet文件至内存的方案及格式选择咨询
字典还是DataFrame?先看你的使用场景
- 要是你的数据字段不固定、每行结构差异大,或者主要做单条记录的键值操作,字典(尤其是嵌套结构)更灵活。
- 但如果是规整的表格数据,需要做过滤、统计、聚合这类批量操作,DataFrame的性能和便捷性甩字典几条街——毕竟Pandas和PyArrow对列存数据的向量化优化,纯Python字典根本比不了。
三种Parquet读取方案的实际表现
1. PyArrow
- 直接读成
pyarrow.Table是最省内存的选择,因为Arrow的列存格式和Parquet天生匹配,不需要额外转换。如果要转字典,别先转DataFrame,直接用table.to_pylist()或者table.to_dict('records')就能拿到字典列表,不会出现内存翻倍的问题——转DataFrame才可能因为Pandas的内存模型(比如对象类型列)增加开销,直接转字典反而更高效。 - 至于
pyarrow.DictionaryArray,这是针对低基数列的字典编码优化,属于列存层面的高效存储,转成字典列表时会自动解码,不用纠结内存浪费。
2. Pandas pd.read_parquet
- 读出来直接是DataFrame,如果你的核心需求是数据处理,这一步完全没必要绕去字典——DataFrame的向量化操作比遍历字典快N倍,而且用
engine='pyarrow'参数的话,还会复用Arrow的列存内存,比默认引擎更省内存。 - 真要转字典的话,
df.to_dict('records')就能生成每行对应的字典列表,Pandas内部做了批量优化,比手动合并小字典高效得多。
3. parquet-python(纯Python实现)
- 这种方式真心不推荐:纯Python解析Parquet速度慢得离谱,而且每行生成小字典再合并,会产生大量临时对象,内存碎片化严重,速度和内存效率都远不如前两种。除非你身处极端环境(比如没法装带C扩展的PyArrow或Pandas),否则别碰。
最后给个明确方向
- 优先看核心操作:表格分析就直接用PyArrow/Pandas读成DataFrame;必须用字典的话,用PyArrow读Table后直接转字典列表,跳过DataFrame环节。
- 彻底放弃parquet-python,性价比极低。
内容的提问来源于stack exchange,提问作者BovineScatologist
相关产品推荐
相关产品推荐

