gpt4 book ai didi

python - PyMongo游标batch_size

转载 作者:行者123 更新时间:2023-12-01 23:31:33 24 4
gpt4 key购买 nike

使用 PyMongo 3.7.2,我尝试通过在 MongoDB 游标上使用 batch_size 来读取 block 中的集合,如所述 here 。基本思想是在集合对象上使用find()方法,并以batch_size作为参数。但无论我尝试什么,光标总是返回我集合中的所有文档。

我的代码的基本片段如下所示(该集合有超过 10K 文档):

import pymongo as pm

client = pm.MongoClient()
coll = client.get_database('db').get_collection('coll')

cur = coll.find({}, batch_size=500)

但是,游标总是立即返回完整的集合大小。我按照文档中的描述使用它。

有谁知道我如何正确地批量迭代集合?有多种方法可以循环遍历 find() 方法的输出,但这仍然会首先获取完整的集合,并且只会循环遍历内存中已拉取的文档。 batch_size参数应该是获取一个批处理并每次往返服务器一次,以节省内存空间。

最佳答案

Pymongo 为 Cursor 类提供了一些高质量的助手,因此它会自动为您进行批处理,并以文档形式将结果返回给您。

batch_size 设置已设置,但想法是您只需要在 find() 方法中设置它,而不必进行手动低级调用或迭代批处理。

例如,如果我的集合中有 100 个文档:

> db.test.count()
100

然后我设置 profiling level记录所有查询:

> db.setProfilingLevel(0,-1)
{
"was": 0,
"slowms": 100,
"sampleRate": 1,
"ok": 1,
...

然后我使用 pymongo 将 batch_size 指定为 10:

import pymongo
import bson

conn = pymongo.MongoClient()
cur = conn.test.test.find({}, {'txt':0}, batch_size=10)
print(list(cur))

运行该查询,我在 MongoDB 日志中看到:

2019-02-22T15:03:54.522+1100 I COMMAND  [conn702] command test.test command: find { find: "test", filter: {} ....
2019-02-22T15:03:54.523+1100 I COMMAND [conn702] command test.test command: getMore { getMore: 266777378048, collection: "test", batchSize: 10, ....
(getMore repeated 9 more times)

因此查询是按指定批处理从服务器获取的。它只是通过 Cursor 类对您隐藏。

编辑

如果你确实需要批量获取文档,Collection ( doc link ) 下有一个函数 find_raw_batches() 。此方法的工作方式与 find() 类似,并接受相同的参数。但请注意,它将返回原始 BSON,应用程序需要在单独的步骤中对其进行解码。值得注意的是,该方法不支持sessions .

话虽如此,如果目标是降低应用程序的内存使用量,则值得考虑修改查询以使其使用范围。例如:

find({'$gte': <some criteria>, '$lte': <some other criteria>})

范围查询更容易优化,可以使用索引,并且(在我看来)更容易调试,并且在查询中断时更容易重新启动。使用批处理时,这不太灵活,您必须从头开始重新启动查询,并在查询中断时再次检查所有批处理。

关于python - PyMongo游标batch_size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com