我将一堆文档插入一个集合,然后一个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
答案 0 :(得分:3)
所以,这基本上是作为服务器端javascript运行,在shell中创建一个巨大的forEach
循环,迭代这些100万个文档,我打赌(非映射)内存的数量是天高的这是在运行。
如果你使用驱动程序在shell外部运行它,则可能根本看不到问题。迁移是否完成,然后没有清理内存?如果是这样,那么这可能就是问题所在。
下一个版本(2.3+)中的更改将使shell具有更高的性能,但是现在通过驱动程序而不是shell内部执行此操作可能更好。首先,在batches中执行此操作会立即提高效率,而不是一次迭代一次。
尽管如此,如果这很容易重现,特别是如果你可以提供一个示例数据集,这将是bug report的完美素材,这样开发人员就可以找出shell为什么会被bar在处理这个循环时。