我有时候需要大量的读取mongodb中的数据,这些数据并不是热数据,我只是读取一次然后就不会在用了,但是每当我执行读取操作的时候,mongodb占用的内存就会飙升,直到99%把所有内存都吃光,然后导致我的业务程序崩溃。。。太坑了,虽然我每次读取的数据量很大,但是这些数据不是热数据啊,我不需要mongodb把他们的索引甚至他们自己加载到内存中,有没有什么办法能禁止mongodb读取数据就缓存的问题
我发现用mongodump的备份数据貌似内存不增加。。。。
而且mongodump有个-q参数可以进行条件筛选
所以我打算先用mongodump备份我要查询的数据,然后再解析导出的bson文件
然鹅,bson文件的解析也是个麻烦事。。。。晕啊
悲剧了,使用-q参数备份数据,内存依然飙升,经过测试,只有不加条件筛选的时候才会不吃内存。。。。
经过各种折腾,我发现一个新的骚操作,既能读取数据,又能不吃内存,那就是用FindOneAndDelete获取数据。。。。FindOneAndDelete顾名思义,就是查询一个数据并且从数据库中删除它。。。正常情况下是万万不能乱用这个函数的,但是因为我的需求是把大量数据按照顺序读出来用一下,然后就不用了,所以我可以用FindOneAndDelete拿数据,用完后,直接将内存中的数据写成文件扔到硬盘上,因为这完全是可控的,所以内存非常的稳定。这样既能解决我的内存飙升问题,还能有限的释放磁盘空间。
因为我怕条件筛选又会导致mongodb吃进大量的内存,所以我用FindOneAndDelete的时候没有直接传入条件,我是先用find查询一次时间范围找到我要的数据的最后一条,然后再循环调用FindOneAndDelete直到某个返回的数据和之前查询的最后一条数据一致,然后就结束,绕了这么大一个圈,终于是解决问题了。。。。
经过各种折腾,我发现一个新的骚操作,既能读取数据,又能不吃内存,那就是用FindOneAndDelete获取数据。。。。FindOneAndDelete顾名思义,就是查询一个数据并且从数据库中删除它。。。正常情况下是万万不能乱用这个函数的,但是因为我的需求是把大量数据按照顺序读出来用一下,然后就不用了,所以我可以用FindOneAndDelete拿数据,用完后,直接将内存中的数据写成文件扔到硬盘上,因为这完全是可控的,所以内存非常的稳定。这样既能解决我的内存飙升问题,还能有限的释放磁盘空间。
因为我怕条件筛选又会导致mongodb吃进大量的内存,所以我用FindOneAndDelete的时候没有直接传入条件,我是先用find查询一次时间范围找到我要的数据的最后一条,然后再循环调用FindOneAndDelete直到某个返回的数据和之前查询的最后一条数据一致,然后就结束,绕了这么大一个圈,终于是解决问题了。。。。
https://dba.stackexchange.com/questions/148395/mongodb-using-too-much-memory
https://stackoverflow.com/questions/6861184/is-there-any-option-to-limit-mongodb-memory-usage
具体的版本和设置方法在你的场景下可以看下上面的设置能够奏效
限制内存使用应该能避免mongodb把内存吃光的问题,但是这可能会影响到它的插入性能,我是想能不能在单个的查询操作上禁止mongodb缓存查询的数据
mongodb会把磁盘文件的一部分或全部内容直接映射到内存,所以会导致内存一直占用很大,最好不要把应用
服务器和mongdb放在一个服务器,分开放
我就是分开放的啊,一个服务器上只放了mongodb,但是查询时,mongodb服务器内存99%,然后我其他服务器上连接mongodb的应用执行插入操作就超时卡死,然后程序就崩溃了