2

我正在尝试将 mysql 表迁移到 mongodb。我的表有 600 万个条目。我使用带有 morphia 的 java。当我节省大约 120 万时,我的内存几乎全部耗尽。

我读过 mongo 将数据存储在内存中,然后保存在磁盘中。是否可以发送诸如提交之类的内容以释放一些内存?

4

2 回答 2

2

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 使用 mmap 将其留给操作系统。因此,只要有更多可用的 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服务器。

于 2012-11-04T20:15:21.860 回答
0

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

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

然后,你会看到输出的mapped,vsize,resmongostat下降了很多。

我试过了,它有效。希望能帮到你,^_^

于 2013-02-23T02:59:37.780 回答