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

 丫头片子ZXH 发布于 2022-12-10 14:44

使用代码:

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字节

我该如何处理?

4 个回答
  • 正如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 +版之后支持

    2022-12-11 01:59 回答
  • 您在内存中排序时遇到32MB限制:

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

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

    2022-12-11 02:06 回答
  • 如果您想避免创建索引(例如,您只想快速检查数据),可以使用磁盘使用聚合:

    all_reviews = db_handle.aggregate([{$sort: {'reviewDate': 1}}], {allowDiskUse: true})
    

    (不知道如何在pymongo中这样做).

    2022-12-11 02:09 回答
  • 用索引解决了

    db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])
    

    2022-12-11 02:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有