MongoDB使用了很多内存

时间:2012-11-04 14:06:02

标签: java mongodb memory-management morphia

我试着将mysql表迁移到mongodb。我的表有600万条目。我使用java与morphia。当我节省大约1,200万时,我的记忆几乎全部耗尽。

我读过mongo将数据存储在内存中并保存在磁盘中。是否有可能发送类似提交的内容来释放一些内存?

2 个答案:

答案 0 :(得分:1)

1)就持久性而言,您可以告诉MongoDB java驱动程序(Morphia正在使用),使用哪种策略,请参阅https://github.com/mongodb/mongo-java-driver/blob/master/src/main/com/mongodb/WriteConcern.java#L53。这只是速度之间的权衡:NONE(甚至连接问题都不会导致错误)直到FSYNC_SAFE(数据肯定写入磁盘)。 有关内部详细信息,请查看http://www.kchodorow.com/blog/2012/10/04/how-mongodbs-journaling-works/

2)您的整个数据都映射到内存(这就是32位版本的大小限制为2GB的原因),但是只在需要时才实际加载。 MongoDB使用mm​​ap将其留给操作系统。因此,只要有更多可用的RAM,MongoDB就会很乐意将所需的所有数据加载到RAM中,以便快速进行查询。如果没有更多可用内存,则由操作系统更换旧内容。即使您重新启动MongoDB进程,这也会产生很好的效果,即您的数据将保留在内存中;只有重新启动服务器本身,才能再次从磁盘中获取数据。我认为缺点是数据库进程可能稍微更好地理解与操作系统相比应首先交换的内容。 我没有在Windows上使用MongoDB,并且还没有在Mac或Linux上看到过该消息,但操作系统应该为您处理(并根据需要自动交换信息)。您是否尝试将驱动程序设置为JOURNAL_SAFE(应该是数据安全性和速度之间的良好折衷方案)?在该设置中,即使MongoDB进程终止,也不会丢失任何数据。

3)一般情况下,MongoDB可以使用尽可能多的可用内存,但您可以使用http://captaincodeman.com/2011/02/27/limit-mongodb-memory-use-windows/来限制它 - 我还没有测试过,因为我们正在使用(虚拟)Linux服务器

答案 1 :(得分:0)

如果你只是想释放mongodb使用的内存,在你的数据被处理并且mongod空闲之后你可以运行这个命令

use admin
db.runCommand({closeAllDatabases: 1})

然后,你会看到mongostat输出的映射的vsize res很多。

我试过了,它有效。希望有所帮助,^ _ ^