我使用pymongo在一个查询中获取大约2M个文档,每个文档只包含三个字符串字段。查询只是一个简单的find(),没有任何limit()或batchSize()。
在迭代光标时,我注意到脚本在处理大约25k文档后等待大约30~40秒。
所以我想知道mongo会在一批中返回所有2M结果吗? pymongo中的默认batchSize()是什么?
答案 0 :(得分:21)
MongoDB中的光标默认返回最多101个文档或足以让你达到1 MB。在弹出到4MB后,调用通过光标进行迭代。返回的文档数量取决于文档的大小:
光标批次
MongoDB服务器批量返回查询结果。批量大小 不会超过最大BSON文件大小。对于大多数查询, 第一批返回101个文件或只有足够的文件超过1 兆字节。后续批量大小为4兆字节。要覆盖 批处理的默认大小,请参见batchSize()和limit()。
对于包含没有索引的排序操作的查询,服务器 必须加载内存中的所有文档以执行排序和将 返回第一批中的所有文件。
当您遍历游标并到达返回的结尾时 批处理,如果有更多结果,cursor.next()将执行getmore 检索下一批的操作。
http://docs.mongodb.org/manual/core/cursors/
您可以在光标上使用pymongo中的batch_size()方法覆盖默认值 - 但是它不会超过16 MB(最大BSON文档大小):
<强>的batch_size(的batch_size)强>
限制一批中返回的文档数量。每批 需要往返服务器。它可以调整以优化 性能和限制数据传输。
请注意
batch_size不能覆盖MongoDB的内部限制量 数据将在一个批次中返回客户端(即如果您设置 批量大小为1,000,000,000,MongoDB目前仅返回4-16MB 每批结果)。
如果batch_size不是整数,则引发TypeError。如果引发ValueError错误 batch_size小于0.如果此Cursor有,则引发InvalidOperation 已经被使用过。应用于此游标的最后一个batch_size采用 优先。 参数:
batch_size:请求的每批结果的大小。
http://api.mongodb.org/python/current/api/pymongo/cursor.html