【问题标题】:MongoDB using much memoryMongoDB使用大量内存
【发布时间】:2012-11-04 14:06:01
【问题描述】:

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

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

【问题讨论】:

  • mongodb使用了多少内存?我没有得到它不需要使用大量内存的印象。通常是根据需要缓存在内存中的数据和索引占用的内存最多。
  • 我的电脑有 6gb,当我开始使用大约 1.5gb 的过程时。在 1,500,000 条记录后,使用的内存为 5,80 GB。我正在使用 Windows,此时操作系统弹出我说某些进程正在使用大量内存,必须关闭,否则数据将丢失。
  • coll 名称未压缩,因此使用 userdata.timestampuser 或 userdata.longnameforfield 之类的名称不是最佳选择。尝试更改名称 eq 时间戳使用 ts, user_id => ui 或 uid
  • 这显然取决于文档结构。对 1KB 的字符串使用 20 个字符的名称不会有太大的不同。使用长名称来存储布尔值显然可以;-)。我仍然希望进行一些内部重新映射,这可以解决这个问题......

标签: java mongodb memory-management morphia


【解决方案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 使用 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 服务器。

【讨论】:

  • 谁的内存和CPU限制很棒我需要尝试:)
【解决方案2】:

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

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

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

我试过了,效果很好。希望能帮到你,^_^

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 2012-01-13
  • 2023-03-24
  • 1970-01-01
  • 2011-11-06
  • 2010-11-13
  • 2014-11-02
相关资源
最近更新 更多