java - MongoDB 使用大量内存

标签 java mongodb memory-management morphia

我正在尝试将 mysql 表迁移到 mongodb。我的表有 600 万个条目。我正在使用 java 和吗啡。当我保存大约 120 万时,我的内存几乎全部被消耗掉。

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

最佳答案

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 服务器。

关于java - MongoDB 使用大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219234/

相关文章:

java - 插件开发的 Maven 依赖

mongodb - Mac OS - 由于权限问题无法使用 Homebrew 安装 mongodb

java - 为什么 netbeans java profiler 在 ~64mb 处崩溃并出现堆溢出错误?

c++ - 在改变 c 字符串时避免内存泄漏

linux -/proc/<pid>/status 中的 VmLck(锁定内存)与 VmPin(固定内存)

java - toArray() 返回对象[]

java - mongodb 中 spring 数据的 json 响应中缺少 id

jquery - 当 Tornado 应用程序的多个实例在数据库中插入项目时,如何避免在 MongoDB 中重复插入?

mongodb - 使用 $inc 来增加 Mongoose 的文档属性

java - Java中有类似JavaScript的 "prototype"的东西吗?