我正在尝试将mysql表迁移到mongodb。我的表有600万个条目。我正在使用带有morphia的java。当我节省了大约120万的内存时,我的内存几乎都被消耗了。
我已经读到了mongo将数据存储在内存中,然后保存到磁盘中。是否可以发送类似提交的命令来释放一定数量的内存?
发布于 2012-11-05 04:15:22
1)在持久性方面,您可以告诉Morphia驱动程序(使用哪个MongoDB ),使用哪种策略,请参阅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位版本有2 2GB的大小限制),但它只在需要时才实际加载。MongoDB通过使用mmap将其留给操作系统。因此,只要有更多的内存可用,MongoDB就会很乐意地将它需要的所有数据加载到内存中,以便非常快速地进行查询。如果没有更多的内存可用,则由操作系统来更换旧内存。这样做的好处是,即使您重新启动MongoDB进程,您的数据也将保留在内存中;只有当您重新启动服务器本身时,才必须再次从磁盘获取数据。我认为缺点是,与操作系统相比,数据库进程可能会稍微更好地理解应该首先换出什么。我没有在Windows上使用MongoDB,也没有在Mac或Linux上看到这条消息,但是操作系统应该会为你处理这个问题(并根据需要自动交换出一些信息)。您是否尝试过将驱动程序设置为JOURNAL_SAFE (应该是数据安全性和速度之间的一个很好的折衷)?在该设置中,即使MongoDB进程终止,也不会丢失任何数据。
3)一般来说,MongoDB被构建为使用尽可能多的可用内存,但您可以使用http://captaincodeman.com/2011/02/27/limit-mongodb-memory-use-windows/来限制它-我还没有测试过,因为我们使用的是(虚拟) Linux服务器。
发布于 2013-02-23 10:59:38
如果你只是想释放一些mongodb使用的内存,在你的数据被处理后,mongodb是空闲的,你可以运行这个命令
use admin
db.runCommand({closeAllDatabases: 1})然后,您将看到mongostat输出的映射、vsize、res下降了很多。
我试过了,它起作用了。希望能有所帮助,^_^
https://stackoverflow.com/questions/13219234
复制相似问题