1

我将一堆文档插入一个集合,然后一个 cron 作业将它们移动到另一个集合。

我这样做的原因是有一个非索引集合需要快速存储数据,第二个集合被索引,因此插入速度很慢,因此 cron 作业移动数据。

我使用以下脚本来移动数据

db.smalldaily.find().forEach(function(doc){db.largedaily.save(doc);db.smalldaily.remove(doc);});

问题是在移动数据完成后,mongod 似乎崩溃了,当我登录 mongo shell 并键入 db.large 然后按 TAB 按钮自动完成集合名称时,mongodb 进入昏迷状态,我需要重新启动 mongod 服务以使其工作。

是我做错了什么,还是说 mongodb 还不成熟的传言部分属实?

我在 CentOS 上使用 MongoDB shell 版本:2.2.1

4

1 回答 1

3

因此,这基本上是作为服务器端 javascript 运行的,它forEach在 shell 中创建一个巨大的循环,遍历这 100 万多个文档,我敢打赌,在运行时(非映射)内存量会非常高。

如果您使用驱动程序在外壳外部运行它,您可能根本看不到问题。迁移是否完成,然后不清理内存?如果是这样,那么这可能就是问题所在。

下一个版本(2.3+)将进行更改以使 shell 性能更高,但现在通过驱动程序而不是在 shell 内部执行此操作可能是一个更好的主意。一方面,分批执行此操作会比一次迭代一个更有效。

话虽如此,如果这很容易重现,特别是如果您可以提供示例数据集,那么这将是错误报告的完美素材,以便开发人员可以弄清楚为什么在处理此循环时外壳会呕吐。

于 2012-11-14T04:51:33.043 回答