Python Pymongo—通过具有大数据的游标进行循环的有效方法
在Pymongo中循环游标对象最有效的方法是什么? 目前,我正在做的就是:Python Pymongo—通过具有大数据的游标进行循环的有效方法,python,pymongo,database-cursor,Python,Pymongo,Database Cursor,在Pymongo中循环游标对象最有效的方法是什么? 目前,我正在做的就是: list(my_db.my_collection.find()) 它将光标转换为列表对象,以便我可以迭代每个元素。如果find()查询返回少量数据,则这种方法可以正常工作。然而,当我缩放数据库以返回1000万个文档时,光标到列表的转换将花费很长时间。我没有将DB结果(游标)转换为list,而是尝试将游标转换为dataframe,如下所示: pd.Dataframe(my_db.my_collection.find(
list(my_db.my_collection.find())
它将光标转换为列表对象,以便我可以迭代每个元素。如果find()查询返回少量数据,则这种方法可以正常工作。然而,当我缩放数据库以返回1000万个文档时,光标到列表的转换将花费很长时间。我没有将DB结果(游标)转换为list,而是尝试将游标转换为dataframe,如下所示:
pd.Dataframe(my_db.my_collection.find())
这并没有给我带来任何绩效提升
在python中循环游标对象最有效的方法是什么?到目前为止,我还没有使用pymongo。
但是有一件事我可以肯定地说,如果你通过
list(my_db.my_collection.find())
然后必须使用生成器
因为,在此处使用列表将显著增加内存使用量,如果超出允许值,可能会引入MemoryError
def get_data():
yeild(my_db.my_collection.find())
尝试使用这些不会占用太多内存的方法。pymongo提供给您的游标对象已经在惰性地加载对象,无需执行任何其他操作
for doc in my_db.my_collection.find():
#process doc
可以迭代的方法
for match in my_db.my_collection.find():
# do something
pass
我很确定find()
已经返回了一个生成器。因此,您可以对my_db.my_collection.find()中的元素执行:
那么,如果find()
是一个生成器,它会在这里创建一个大型项目的列表吗?是的,OP正在从生成器创建一个列表,这就是它效率低下的原因。我觉得双生成器在这种情况下最好实现
find()
返回一个生成器,我们将其置于get\u data()
下
参考: