如何使用 Pymongo 从游标中插入多个?
How to insertmany from a cursor using Pymongo?
我对使用游标将数据库从一个 mongod 复制到另一个感兴趣。我想限制发送的插入请求的数量,所以我不想在游标中单独插入每个文档,而是想对每个游标批处理 insert_many。
在 pymongo/python 中有没有办法做到这一点?
我试过将游标转换为列表,然后调用 insert_many 并且这有效,但是如果集合超过了我拥有的 ram 数量,它将无法工作。
任何关于如何从游标中获取批次并将其转换为列表的想法都将不胜感激
谢谢!
我还不能发表评论,但我最近遇到了同样的问题。我找到了很多解决方案,其中 none 对我的具体情况来说是令人满意的。
在你的情况下,有与python/pymongo和光标一起使用吗?如果是这样,目前没有办法做到这一点,但我花了很多时间挖掘 pymongo source code 来确认,我想我可以使用他们的一些较低级别的 API 来完成这个。我做的时候会通知你。
到目前为止,这是我的 "slice/batch" 解决方案,它比从游标单独迭代每个文档更有效:
- 记下您抓取的最后一个文档的 id 字段
- 使用查询 "Greater than _id of last doc" 打开游标,限制为
不管你的batch_size是什么
- 现在您应该有一个光标,其中包含您想要的一批文档数量
- 通过执行 list(cursor)
将此游标变成 python 列表
- Insert_many 在此列表中
- 更新上次抓取,并删除列表以释放内存
您可以调整批量大小以适应您的 RAM 限制。这是一个很好的解决方案,因为它减少了游标迭代的瓶颈,而且不会占用太多内存,因为您会不断删除批次。
我对使用游标将数据库从一个 mongod 复制到另一个感兴趣。我想限制发送的插入请求的数量,所以我不想在游标中单独插入每个文档,而是想对每个游标批处理 insert_many。
在 pymongo/python 中有没有办法做到这一点?
我试过将游标转换为列表,然后调用 insert_many 并且这有效,但是如果集合超过了我拥有的 ram 数量,它将无法工作。
任何关于如何从游标中获取批次并将其转换为列表的想法都将不胜感激
谢谢!
我还不能发表评论,但我最近遇到了同样的问题。我找到了很多解决方案,其中 none 对我的具体情况来说是令人满意的。
在你的情况下,有与python/pymongo和光标一起使用吗?如果是这样,目前没有办法做到这一点,但我花了很多时间挖掘 pymongo source code 来确认,我想我可以使用他们的一些较低级别的 API 来完成这个。我做的时候会通知你。
到目前为止,这是我的 "slice/batch" 解决方案,它比从游标单独迭代每个文档更有效:
- 记下您抓取的最后一个文档的 id 字段
- 使用查询 "Greater than _id of last doc" 打开游标,限制为 不管你的batch_size是什么
- 现在您应该有一个光标,其中包含您想要的一批文档数量
- 通过执行 list(cursor) 将此游标变成 python 列表
- Insert_many 在此列表中
- 更新上次抓取,并删除列表以释放内存
您可以调整批量大小以适应您的 RAM 限制。这是一个很好的解决方案,因为它减少了游标迭代的瓶颈,而且不会占用太多内存,因为您会不断删除批次。