基于PyMongo的MongoDB大数据集扩展性能优化问题咨询
MongoDB CRUD API游标解包性能优化问题
背景
我负责的CRUD API用于读写存储实验室数据的MongoDB数据库,当前遇到扩展性能问题:
- 每个测量值对应一个文档,包含前后置日志及实际测量数据,文档体积较大
- 需要处理超大规模数据集(对应15000+行、650+列的Excel表格)
- 已自行生成唯一
_id,避免服务器端重新索引生成_id键 - 后端基于Flask API开发,通过PyMongo与MongoDB服务器通信
文档结构示例
{ "_id" : "7CEXTIA5KUGLRQLIH62T", <some 60 k/v pairs>, "blockName" : "a particular measurement field", "blockValue" : 1, "job" : "job", "project" : "project", "__ids__" : "2TMOHO74WQ7CYPWM32JD", "testname" : "VOLUME_DATA" }
注:每个文档包含前后置日志及一项测量值,对应Excel表格中的一列。
性能瓶颈
性能开销集中在游标解包阶段:将查询结果的每个文档收集到数组,再转换为DataFrame,这部分耗时占比极高。核心代码如下:
res = collection.find(filt) qData = [] for x in collection.find(filt): qData.append(x) ret_data = post_process.convert_data_frame(qData) return { "retrieved": ret_data, "status":"OK", "code":"200", "rows": ret_data.shape[0], "cols": ret_data.shape[1] }
耗时统计
[Query Time :0.0] [Array length: 381656] [Collection into Array Time :179.22241806983948] [Array to DF Time :11.4875328540802]
疑问
- 有没有更高效的元素收集方法替代当前的游标遍历+数组追加?
- 文档大小(包含65+键的字典)是否会直接影响数组收集的速度?
- 分批查询构建数组是否能提升性能?但本质仍需遍历游标,不确定是否有实际收益?
内容的提问来源于stack exchange,提问作者Paul Kumar
相关产品推荐
相关产品推荐

