问题:
我有时候需要大量的读取mongodb中的数据,这些数据并不是热数据,我只是读取一次然后就不会在用了,但是每当我执行读取操作的时候,mongodb占用的内存就会飙升,直到99%把所有内存都吃光,然后导致我的业务程序崩溃。。。太坑了,虽然我每次读取的数据量很大,但是这些数据不是热数据啊,我不需要mongodb把他们的索引甚至他们自己加载到内存中,有没有什么办法能禁止mongodb读取数据就缓存的问题
回答1:
经过各种折腾,我发现一个新的骚操作,既能读取数据,又能不吃内存,那就是用FindOneAndDelete获取数据。。。。FindOneAndDelete顾名思义,就是查询一个数据并且从数据库中删除它。。。正常情况下是万万不能乱用这个函数的,但是因为我的需求是把大量数据按照顺序读出来用一下,然后就不用了,所以我可以用FindOneAndDelete拿数据,用完后,直接将内存中的数据写成文件扔到硬盘上,因为这完全是可控的,所以内存非常的稳定。这样既能解决我的内存飙升问题,还能有限的释放磁盘空间。
因为我怕条件筛选又会导致mongodb吃进大量的内存,所以我用FindOneAndDelete的时候没有直接传入条件,我是先用find查询一次时间范围找到我要的数据的最后一条,然后再循环调用FindOneAndDelete直到某个返回的数据和之前查询的最后一条数据一致,然后就结束,绕了这么大一个圈,终于是解决问题了。。。。
回答2:
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
具体的版本和设置方法在你的场景下可以看下上面的设置能够奏效
回答3:
mongodb会把磁盘文件的一部分或全部内容直接映射到内存,所以会导致内存一直占用很大,最好不要把应用
服务器和mongdb放在一个服务器,分开放