Mongo聚合函数使用Sort排序时内存不足导致查询失败,开启allowDiskUse=true
目录
1、问题描述
2、问题解决
1. Java代码方式解决办法
2. Mongo 原生聚合函数解决办法
1、问题描述
由于项目原因, 需要向数据存储至mongo,在使用过程中 , 单个document(集合)数据量大概在80万条左右 , 单条数据为16的栏位(属性) ,
现有如下需求 , 根据某些特定条件一次性查出N条数据(大致数量在8万条左右) , 并进行 sort 排序,然后在使用Java代码查询时候, 直接抛出了异常 ,
经过Debug跟踪发现在问题具体抛出点是在 进行Sort时导致的 代码如下:
List<AggregationOperation> aggregationOptions = new ArrayList<>();AggregationOptions publicAggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();aggregationOptions.add(Aggregation.match(Criteria.where("benchId").is(benchDocument.getBenchId())));// 这里就是问题引发处....aggregationOptions.add(Aggregation.sort(Sort.Direction.DESC,"routeCode", "procedureName", "procedureCode", "paramCode"));
由以上代码抛出的异常信息如下:
org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 16819 (Location16819): 'Sort exceeded memory limit of 104857600 bytes,
but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.' on server 192.168.207.234:27017.
The full response is {"ok": 0.0, "errmsg": "Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.", "code": 16819, "codeName": "Location16819"};nested exception is com.mongodb.MongoCommandException: Command failed with error 16819 (Location16819): 'Sort exceeded memory limit of 104857600 bytes,but did not opt in to external sorting. Aborting operation.
Pass allowDiskUse:true to opt in.' on server 192.168.207.234:27017. The full response is {"ok": 0.0, "errmsg": "Sort exceeded memory limit of 104857600 bytes,but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.", "code": 16819, "codeName": "Location16819"}at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:138)at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2902)at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:587)
上面的报错信息是由 spring-data-mongo 封装了原本的mongo报错信息重新打印出来的 , 稍微有点乱 , 意思就是在MongoDB中,内存中排序有100M的限制 要执行大型排序,需要启用allowDiskUse=true
选项使用系统缓存将数据写入临时文件以进行排序。
Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.
2、问题解决
1. Java代码方式解决办法
Spring Data MongoDB api不同版本对allowDiskUse设置的操作写法不同。
对于Spring Data MongoDB 1.5.x以上2.0版本以下版本并没有提供显式的封装 , 故而需要自己创建:
AggregationOptions aggregationOptions = new AggregationOptions(true, false, null);
2.0及以上版本提供内部静态类,以builder的方式设置:
AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
设置完该属性之后 , 需要将 AggregationOptions 通过 Aggregation.newAggregation()..withOptions(AggregationOptions ) 使之生效 , 具体用发如下:
AggregationOptions publicAggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();aggregationOptions.add(Aggregation.match(Criteria.where("benchId").is(123)));aggregationOptions.add(Aggregation.sort(Sort.Direction.DESC,"routeCode", "procedureName", "procedureCode", "paramCode"));// .withOptions()Aggregation aggregation = Aggregation.newAggregation( aggregationOptions).withOptions(publicAggregationOptions);AggregationResults<Document> aggregate = mongoTemplate.aggregate(aggregation,COLLECTION_NAME, Document.class);
2. Mongo 原生聚合函数解决办法
Mongo原生聚合函数 , 取十万条数据 , 进行排序
db.getCollection("document001").aggregate([{$project: {_id: 0}},{$skip: 0},{$limit: 100000},{$sort: {temperature: 1,supplierWorkNo: 1,checkTime: - 1}}
])
mongo提示报错信息
其实解决办法 , 提示信息中也已经写了出来 加上 allowDiskUse 属性即可 , 修改后SQL 如下:
db.getCollection("document001").aggregate([{$project: {_id: 0}},{$skip: 0},{$limit: 77000},{$sort: {temperature: 1,supplierWorkNo: 1,checkTime: - 1}}
], {allowDiskUse: true
})
Mongo聚合函数使用Sort排序时内存不足导致查询失败,开启allowDiskUse=true相关推荐
- MongoDB排序时内存大小限制和创建索引的注意事项
线上服务的MongoDB中有一个很大的表,我查询时使用了sort()根据某个字段进行排序,结果报了下面这个错误: [Error] Executor error during find command ...
- spring-data-elasticsearch使用Sort排序时Please use a keyword field instead. ……异常解决
异常信息 核心提示在Please use a keyword field instead. Alternatively, set fielddata=true on [dataTimestamp] i ...
- springboot的Sort排序时遇到的问题 has private access in ‘org.springframework.data.domain.Sort‘
springboot2.2.1(含)以上的版本Sort已经不能再实例化了,构造方法已经是私有的了! private Sort(Sort.Direction direction, List<Str ...
- 解决SpringBoot整合SpringData JPA的PagingAndSortingRepository的Sort排序时遇到的错误:has protected access in ‘org.sp
问题: 原因: pringboot2.2.1(含)以上的版本Sort已经不能再实例化了,构造方法已经是私有的了! 解决方法: 我们可以改用Sort.by获得Sort对象
- CoreData + CloudKit 支持的 App 在导出(export)新建托管对象时内存飙升导致被杀死的解决
问题现象 CoreData + CloudKit 支持的 App 在新建托管对象并同步导出到云时可能会导致进程内存疯狂增长,最终很快被系统杀死. 如果你的 App 满足以下三点,那么很可能出现这种情况 ...
- oracle数据库内存不足导致查询变慢,经验:探索内存问题如何造成数据库性能严重异常...
导读:在使用数据库的过程中,内存不足常常会引起数据库异常.但是内存不足,又会为数据库带来哪些具体的影响呢?本次,我们将通过某客户现场数据库在某个时段内性能严重下降的案例来展示由于主机内存不足而造成数据 ...
- mysql索引优化longtext_mysql中longtext存在大量数据时,会导致查询很慢?
一个表,1.5w条数据,字段: id,name,content,last_update_time id,自定义主键 name,varchar类型 content是longtext类型, last_up ...
- nginx 下载带中文名静态资源时中文乱码导致下载失败
在使用xMFtp上传中文名资源文件时选择:
- mysql longtext 查询_mysql中longtext存在大量数据时,会导致查询很慢?
一个表,1.5w条数据,字段: id,name,content,last_update_time id,自定义主键 name,varchar类型 content是longtext类型, last_up ...
最新文章
- NBT:设计稳定无毒的抗菌肽杀灭耐药菌
- oracle nvachar 长度,Oracle中varchar、varchar2和nvarchar、nvarchar2
- 第 10 章 容器监控 - 078 - Docker 最常用的监控方案
- 【机器学习】集成学习代码练习
- 调用图片按钮的img图片
- 实现网页定时刷新或跳转到其他页面(Refresh头字段)
- eclipse安装emmet之后ctrl+d热键冲突的解决方法
- 用双边模式,让生意立刻火爆
- windows下如何用python抓取邮件内容和附件_用python下载邮件内容
- mysql所有版本介绍_MySQL各版本介绍
- 智哪儿观察:苹果的智能家居为什么没做起来?
- python3实现灰度图的双三次插值算法缩放
- 瞬时功率与有功功率计算公式
- ftp软件绿色版,四款好用的绿色版ftp软件
- 数据库三范式设计习题
- Python爬虫实战:分析《战狼2》豆瓣影评
- SEO优化,外链重要还是友情链接重要?
- 视听说教程(第三版)4 quiz 8
- MPLAB X IDE安装与MPLAB XC8 Compiler环境配置
- 微信双开多开电脑版本教程(免费简单易学真实可用)
热门文章
- ECDSA VS Schnorr signature VS BLS signature
- STM32F411核心板固件库开发(一) GPIO基本配置
- Linux使用vi修改、删除、保存文件
- java数组常见异常:下标越界、空指针异常
- [转]NAT类型与检测
- 网游点卡接口说明文档
- Linux TC流量控制HOWTO中文版
- 有时用weblogic用户启动weblogic时会报错的原因以及解决办法
- [4G5G专题-92]:流程 - 4G LTE 终端在RRC IDLE空闲状态下的小区选择与小区重选
- win10计算机休眠在哪里调,win10设置休眠时间怎么操作_win10如何更改电脑休眠时间...