【问题标题】:Pymongo - Efficient way to loop through cursor having large dataPymongo - 循环遍历具有大数据的游标的有效方法
【发布时间】:2019-12-16 01:13:14
【问题描述】:

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

list(my_db.my_collection.find())  

它将光标转换为列表对象,以便我可以遍历每个元素。如果 find() 查询返回少量数据,这很好用。但是,当我扩展数据库以返回 1000 万个文档时,游标到列表的转换需要很长时间。我没有将数据库结果(光标)转换为列表,而是尝试将光标转换为数据框,如下所示:

pd.Dataframe(my_db.my_collection.find())  

这并没有给我带来任何性能提升。

在python中循环游标对象最有效的方法是什么?

【问题讨论】:

    标签: python pymongo database-cursor


    【解决方案1】:

    到目前为止,我还没有使用过 pymongo。
    但是我可以肯定地说一件事,如果您通过以下方式获取大量数据

    list(my_db.my_collection.find()) 
    

    那么你必须使用generator
    因为,这里使用 list 会显着增加内存使用量,如果超出允许值,可能会带来MemoryError

    def get_data():
        yield(my_db.my_collection.find())
    

    尝试使用不会占用太多内存的方法。

    【讨论】:

    • 我很确定find() 已经返回了一个生成器。所以你可以做for element in my_db.my_collection.find():
    • 那么如果find() 是一个生成器,它是否会在这里为大项目创建一个列表?如果是,仍然可能会造成麻烦。
    • 是的,OP 正在从生成器创建一个列表,这就是它效率低下的原因
    • 我觉得在这种情况下双生成器会很好实现。
      find() 返回一个我们放在get_data() 下的生成器。
      参考:good read
    【解决方案2】:

    pymongo给你的游标对象已经是懒加载对象了,不需要做任何其他事情。

    for doc in my_db.my_collection.find():
        #process doc
    

    【讨论】:

      【解决方案3】:

      可以迭代的方法find() returns a Cursor

      for match in my_db.my_collection.find():
          # do something
          pass
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 2014-12-18
        • 2020-09-02
        • 2021-07-30
        相关资源
        最近更新 更多