Python 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(

在Pymongo中循环游标对象最有效的方法是什么? 目前,我正在做的就是:

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()

参考: