读取.bson文件转pandas DataFrame报objsize too large错误如何解决
问题根因
objsize too large报错和数据里的datetime字段、嵌套结构没有关系,90%的场景是两个原因导致:
- 依赖安装错误:PyPI上独立发布的
bson包和MongoDB官方维护的、随pymongo分发的BSON实现完全不兼容,如果你之前执行过pip install bson装了独立第三方bson包,解析标准MongoDB导出的BSON文件时必然出现解析异常。 - 读取方式问题:
bson.decode_all(f.read())会一次性把整个文件读入内存全量解码,遇到大体积文件、文件尾部截断损坏的场景会直接抛出解析错误,没有容错空间。
解决步骤
按顺序操作即可:
清理冲突依赖,安装正确版本
先执行命令卸载冲突包,再安装官方维护的依赖:pip uninstall -y bson pymongo pip install pymongo pandas注意:安装完pymongo后不要额外单独执行
pip install bson,两个包共存会持续触发解析冲突。替换为迭代式读取代码
放弃全量读入+decode_all的写法,改用官方提供的文件迭代解码器,逐文档解析,既支持大文件低内存读取,也能自动跳过部分尾部损坏的片段:import pandas as pd from bson import decode_file_iter FILE = "users_(1).bson" data = [] # 逐文档遍历解析BSON文件 for doc in decode_file_iter(open(FILE, "rb")): data.append(doc) main_df = pd.DataFrame(data) # 如需展开嵌套的subscription字段,可执行下面的扁平化处理 # subscription_cols = pd.json_normalize(main_df["subscription"]).add_prefix("subscription_") # main_df = pd.concat([main_df.drop(columns=["subscription"]), subscription_cols], axis=1) main_df.describe()文件完整性校验
如果执行完前两步仍报错,可通过逐文档计数的方式定位损坏位置:from bson import decode_file_iter FILE = "users_(1).bson" doc_count = 0 try: for _ in decode_file_iter(open(FILE, "rb")): doc_count += 1 print(f"文件全部解析完成,共{doc_count}条文档") except Exception as e: print(f"解析到第{doc_count + 1}条文档时触发错误:{str(e)},文件在此位置存在截断或格式损坏")
BSON转JSON实现
如果需要转成你熟悉的JSON格式处理,自定义序列化规则处理特殊类型即可:
import json from bson import ObjectId from datetime import datetime def custom_serializer(obj): if isinstance(obj, ObjectId): return str(obj) if isinstance(obj, datetime): return obj.isoformat() raise TypeError(f"不可序列化的类型:{type(obj)}") with open("users_export.json", "w", encoding="utf-8") as f: json.dump(data, f, default=custom_serializer, ensure_ascii=False, indent=2)
内容的提问来源于stack exchange,提问作者rachel787
相关产品推荐
相关产品推荐

