首页 新闻 会员 周边 捐助

mongodb有没有什么办法禁止读取数据的时候进行缓存

1
悬赏园豆:60 [已解决问题] 解决于 2020-12-09 16:26

我有时候需要大量的读取mongodb中的数据,这些数据并不是热数据,我只是读取一次然后就不会在用了,但是每当我执行读取操作的时候,mongodb占用的内存就会飙升,直到99%把所有内存都吃光,然后导致我的业务程序崩溃。。。太坑了,虽然我每次读取的数据量很大,但是这些数据不是热数据啊,我不需要mongodb把他们的索引甚至他们自己加载到内存中,有没有什么办法能禁止mongodb读取数据就缓存的问题

问题补充:

我发现用mongodump的备份数据貌似内存不增加。。。。
而且mongodump有个-q参数可以进行条件筛选
所以我打算先用mongodump备份我要查询的数据,然后再解析导出的bson文件
然鹅,bson文件的解析也是个麻烦事。。。。晕啊

悲剧了,使用-q参数备份数据,内存依然飙升,经过测试,只有不加条件筛选的时候才会不吃内存。。。。

经过各种折腾,我发现一个新的骚操作,既能读取数据,又能不吃内存,那就是用FindOneAndDelete获取数据。。。。FindOneAndDelete顾名思义,就是查询一个数据并且从数据库中删除它。。。正常情况下是万万不能乱用这个函数的,但是因为我的需求是把大量数据按照顺序读出来用一下,然后就不用了,所以我可以用FindOneAndDelete拿数据,用完后,直接将内存中的数据写成文件扔到硬盘上,因为这完全是可控的,所以内存非常的稳定。这样既能解决我的内存飙升问题,还能有限的释放磁盘空间。
因为我怕条件筛选又会导致mongodb吃进大量的内存,所以我用FindOneAndDelete的时候没有直接传入条件,我是先用find查询一次时间范围找到我要的数据的最后一条,然后再循环调用FindOneAndDelete直到某个返回的数据和之前查询的最后一条数据一致,然后就结束,绕了这么大一个圈,终于是解决问题了。。。。

WmW的主页 WmW | 菜鸟二级 | 园豆:424
提问于:2020-12-03 18:52
< >
分享
最佳答案
0

经过各种折腾,我发现一个新的骚操作,既能读取数据,又能不吃内存,那就是用FindOneAndDelete获取数据。。。。FindOneAndDelete顾名思义,就是查询一个数据并且从数据库中删除它。。。正常情况下是万万不能乱用这个函数的,但是因为我的需求是把大量数据按照顺序读出来用一下,然后就不用了,所以我可以用FindOneAndDelete拿数据,用完后,直接将内存中的数据写成文件扔到硬盘上,因为这完全是可控的,所以内存非常的稳定。这样既能解决我的内存飙升问题,还能有限的释放磁盘空间。
因为我怕条件筛选又会导致mongodb吃进大量的内存,所以我用FindOneAndDelete的时候没有直接传入条件,我是先用find查询一次时间范围找到我要的数据的最后一条,然后再循环调用FindOneAndDelete直到某个返回的数据和之前查询的最后一条数据一致,然后就结束,绕了这么大一个圈,终于是解决问题了。。。。

WmW | 菜鸟二级 |园豆:424 | 2020-12-09 16:10
其他回答(2)
0
收获园豆:30
2012 | 园豆:21645 (高人七级) | 2020-12-04 08:42

限制内存使用应该能避免mongodb把内存吃光的问题,但是这可能会影响到它的插入性能,我是想能不能在单个的查询操作上禁止mongodb缓存查询的数据

支持(0) 反对(0) WmW | 园豆:424 (菜鸟二级) | 2020-12-04 09:42
1

mongodb会把磁盘文件的一部分或全部内容直接映射到内存,所以会导致内存一直占用很大,最好不要把应用
服务器和mongdb放在一个服务器,分开放

收获园豆:30
不知道风往哪儿吹 | 园豆:2037 (老鸟四级) | 2020-12-04 09:22

我就是分开放的啊,一个服务器上只放了mongodb,但是查询时,mongodb服务器内存99%,然后我其他服务器上连接mongodb的应用执行插入操作就超时卡死,然后程序就崩溃了

支持(0) 反对(0) WmW | 园豆:424 (菜鸟二级) | 2020-12-04 10:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册