为了账号安全,请及时绑定邮箱和手机立即绑定

溢出排序阶段缓冲的数据使用量超出内部限制

/ 猿问

溢出排序阶段缓冲的数据使用量超出内部限制

绝地无双 2019-11-13 14:41:51

使用代码:


all_reviews = db_handle.find().sort('reviewDate', pymongo.ASCENDING)

print all_reviews.count()


print all_reviews[0]

print all_reviews[2000000]

计数打印2043484,然后打印all_reviews[0]。


但是,在打印时all_reviews[2000000],出现错误:


pymongo.errors.OperationFailure:数据库错误:运行程序错误:溢出排序阶段缓冲数据使用量33554495字节超过了内部限制33554432字节


我该如何处理?


查看完整描述

3 回答

?
凤凰求蛊

您在内存中遇到了32MB的限制:


https://docs.mongodb.com/manual/reference/limits/#Sort-Operations


将索引添加到排序字段。这使MongoDB可以按排序顺序将文档流式传输给您,而不是尝试将它们全部加载到服务器上的内存中并在将它们发送到客户端之前对它们进行内存排序。


查看完整回答
反对 回复 2019-11-13
?
至尊宝的传说

如kumar_harsh评论部分所述,我想补充一点。


您可以在admin数据库上使用以下命令查看当前缓冲区的使用情况:


> use admin

switched to db admin

> db.runCommand( { getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1 } )

{ "internalQueryExecMaxBlockingSortBytes" : 33554432, "ok" : 1 }

它的默认值为32 MB(33554432字节)。在这种情况下,您的缓冲区数据不足,因此您可以使用自己定义的最佳值来增加缓冲区限制,例如50 MB,如下所示:


>  db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes:50151432})

{ "was" : 33554432, "ok" : 1 }

我们还可以通过mongodb配置文件中的以下参数永久设置此限制:


setParameter=internalQueryExecMaxBlockingSortBytes=309715200

希望这可以帮助 !!!


Note:此命令仅在3.0 +版本之后才支持


查看完整回答
反对 回复 2019-11-13
?
慕村225694

就我而言,有必要在代码中修复必要的索引并重新创建它们:


rake db:mongoid:create_indexes RAILS_ENV=production

因为当需要字段索引时不会发生内存溢出。


PS在此之前,我必须禁用创建长索引时的错误:


# mongo

MongoDB shell version: 2.6.12

connecting to: test

> db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )

也可能需要reIndex:


# mongo

MongoDB shell version: 2.6.12

connecting to: test

> use your_db

switched to db your_db

> db.getCollectionNames().forEach( function(collection){ db[collection].reIndex() } )


查看完整回答
反对 回复 2019-11-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信