0

我的 mongodb 中有大量数据。它充满了推文(50 GB),我的 Ram 是 8 GB。查询时它会检索所有推文,mongodb 开始填充内存,当它达到 8 GB 时,它开始将文件移动到磁盘。这是它变得非常慢wwww的部分。所以我将查询从跳过并开始使用索引更改。现在我有索引,我只向我的程序查询 8GB,保存文件中使用的最后一条推文的 id,程序停止。然后重新启动程序,它会从文件中获取推文的 id。但是 mogod 服务器仍然占用了前 8GB 的​​内存,将不再使用,因为我有最后一个索引。如何在不重新启动的情况下清理 mongo db 服务器的内存?

(跑赢)

4

1 回答 1

0

我对你这里的逻辑有点困惑。

所以我将查询从跳过并开始使用索引更改。现在我有索引,我只向我的程序查询 8GB,保存文件中使用的最后一条推文的 id,程序停止。

使用范围查询将无助于您必须分页的数据量(实际上它可能会因为索引而恶化),它只是通过使用索引进行大量跳过(如 42K+ 行跳过)使查询在服务器端更快。如果你和那个一样,skip()但是在索引中(没有覆盖的索引),那么你仍然在完全相同的分页中。

由于内存映射和您的工作集,它很慢。您拥有比 RAM 更多的数据,不仅如此,而且您使用的数据比 RAM 还多,因此您可能一直处于页面错误状态。

重新启动程序不会解决这个问题,也不会因为您的查询而清除其数据操作系统端(使用重新启动或特定命令)。您可能需要:

  • 考虑您的查询,以便您的工作集更符合您的记忆
  • 或者将您的数据分片到多台服务器上,这样您就不必建立您的主服务器
  • 或获得更大的主服务器(moar RAM !!!!!!)

编辑

你的操作系统的 LRU 应该已经换出了旧数据,因为 MongoDB 正在使用其完全分配的批次,这意味着如果没有交换 8GB,那是因为你的工作集占用了全部 8GB(很可能在结尾)。

于 2013-01-06T16:34:15.307 回答