首页 > 其他分享 > Sort operation used more than the maximum 33554432 bytes of RAM

Sort operation used more than the maximum 33554432 bytes of RAM

时间:2022-11-02 00:45:41浏览次数:80  
标签:Sort sort 32MB used internalQueryExecMaxBlockingSortBytes MongoDB RAM 参数 排序

在数据量超大的情形下,任何数据库系统在创建索引时都是一个耗时的大工程,下面这篇文章主要给大家介绍了关于MongoDB排序时内存大小限制与创建索引的注意事项的相关资料,需要的朋友可以参考下

线上服务的MongoDB中有一个很大的表,我查询时使用了sort()根据某个字段进行排序,结果报了下面这个错误:

[Error] Executor error during find command :: caused by :: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.
at line 0, column 0

这是个非常常见的MongoDB报错了。因为MongoDB处理排序时,如果排序的字段没有建立索引,会把全表都丢到内存中处理。

If MongoDB cannot use an index or indexes to obtain the sort order, MongoDB must perform a blocking sort operation on the data. A blocking sort indicates that MongoDB must consume and process all input documents to the sort before returning results.

而内存的大小并不是无限使用的,MongoDB的默认设置是32MB。一旦数据量超过32MB,则会报错。

参数internalQueryExecMaxBlockingSortBytes

32MB这个限制是在参数internalQueryExecMaxBlockingSortBytes中控制。你可以在MongoDB的客户端上直接查看这个参数的值,执行以下语句:

1 2 3 4 db.runCommand({     getParameter: 1,     "internalQueryExecMaxBlockingSortBytes": 1 })

返回如下结果:

// 1
{
    "internalQueryExecMaxBlockingSortBytes": NumberInt("33554432"),
    "ok": 1,
    "operationTime": Timestamp(1651142670, 1),
    "$clusterTime": {
        "clusterTime": Timestamp(1651142670, 1),
        "signature": {
            "hash": BinData(0, "X09M2FBji5f+FOwaK/nLTv4+Ybs="),
            "keyId": NumberLong("7080087363631710209")
        }
    }
}

所以解决排序时内存使用超过32MB的问题,有两个方法:

给排序的字段加索引。具体怎么加索引,会在后面细讲。

修改internalQueryExecMaxBlockingSortBytes参数的大小,使用命令如下:

1 2 3 4 db.adminCommand({     setParameter: 1,     internalQueryExecMaxBlockingSortBytes: 104857600 })

MongoDB 4.3的internalQueryMaxBlockingSortMemoryUsageBytes

我准备在本地的MongoDB上复现这个问题,于是把这个表直接导入到本地MongoDB中。结果发现排序时并没有报错。使用上面的命令查看internalQueryExecMaxBlockingSortBytes参数的值时,返回如下结果:

[17][ProtocolError] no option found to get

Google了一下,发现了MongoDB的官方网站上的两个相关JIRA。

第一个JIRA [SERVER-44053] Rename setParameter for maximum memory usage of blocking sort - MongoDB Jira里表示,在4.3.1版本时,因为参数命名描述不清楚,所以将参数internalQueryExecMaxBlockingSortBytes改为了internalQueryMaxBlockingSortMemoryUsageBytes。这解释了为什么我执行查询参数的语句时,没有返回结果。

第二个JIRA [SERVER-50767] internalQueryExecMaxBlockingSortBytes causing config exception on mongod load - Mongo中,Comments里提到了,新的internalQueryMaxBlockingSortMemoryUsageBytes参数,默认值从32MB改成了100MB。也许我的这个表使用100MB内存进行排序就够用了,所以没有报错。

 

标签:Sort,sort,32MB,used,internalQueryExecMaxBlockingSortBytes,MongoDB,RAM,参数,排序
From: https://www.cnblogs.com/yelanggu/p/16849684.html

相关文章

  • DataFrame写入excel不同的sheet
    直接上代码初始化2个dataframedf1=pd.DataFrame({'Name':['Jack','Kate','Jim','Steve'],'Gender':['M','F','M','M'],'Height&#......
  • C#、.Net和.Net Framework的区别
    C#是一种编程语言,.Net是微软的技术平台、.NetFramework是一个框架,包含了丰富的类库和将C#代码编译成中间语言的公共语言运行库(CLR)。.Net就像一个厨房,提供了一个烹饪的......
  • 注解@RequestParam,@RequestAttribute 还有二者区别。
    注解1.@RequestParam注解1.1作用:@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)1.2语法:语法:@RequestParam(value=”参数名”......
  • Coursera Programming Languages, Part C 华盛顿大学 Week 3
    整个系列课程的最后一小结!介绍了之前在\(interface\)中所提到的\(subtype\)系统以及其与ML中\(generics\)的不同introductiontosubtyping在之前的课堂中(主......
  • ABP Value cannot be null. (Parameter 'unitOfWork')
    ABPValuecannotbenull.(Parameter'unitOfWork') 解决方式将需要处理的代码放置到如下位置privatereadonlyIUnitOfWorkManager_unitOfWorkManager;using(v......
  • RobotFrameWork基础一
    1.变量:     作用域:SetGlobalVariables:设定全局级变量SetSuiteVariables:设定TestSuite级变量       SetTestVariable:设......
  • 2022 Shanghai Collegiate Programming Contest
    比赛链接:https://codeforces.com/gym/103931A.AnotherA+BProblem题意:给定一个等式和等式每个位置对应的颜色。如果颜色是绿色,那答案的这一位也要是这个字符。如果......
  • 出现类似于Parameter 'xxx' not found问题
      问题一可能是在xml对应的绑定名不正确,例如  这个的问题,而我是绑定了又找不到,原因如下在xml的iftest中名称不对  小写的给它写成大写了所以要对应名称要......
  • 2022 China Collegiate Programming Contest (CCPC) Guilin Site
    比赛链接2022ChinaCollegiateProgrammingContest(CCPC)GuilinSiteC.ArrayConcatenation给定一个长度为\(n\)的数组\(b_i\),有两种操作变换:\(b^{\prime}=\l......
  • sort和sorted区别
    描述sort与sorted区别: sort是应用在list上的方法,属于列表的成员方法,sorted可以对所有可迭代的对象进行排序操作。list的sort方法返回的是对已经存在的列......