2011-08-27 37 views
2

我在mongo集合中有数以万计的行,并且需要更新所有这些行。 我写了一个蒙戈外壳(JS)这样的脚本:更新大量数据的最快方法

db.Test.find().forEach(function(row) { 
    // change data and db.Test.save() 
}); 

其中(我猜)应该会更快然后例如通过任何语言驱动程序更新由于蒙戈Web服务器和蒙戈服务器本身,只是因为这样的事实,即驾驶者之间可能存在的延迟“东西在上面”,并且是“东西在地下室”。

即使它可以更新大约2 100 rec./sec四核2.27GHz处理器与4GB RAM。

据我所知mongoimport可以处理周围40K rec./sec(在同一台机器上),我不认为提到的速度是什么,“快”。

有没有更快的方法?

回答

3

这里有两个可能的限制因素:

  1. 单写锁: MongoDB中只有一个写锁,这可能是决定性的因素。
  2. 磁盘访问:如果正在更新的数据是不积极在内存中,将需要从磁盘,这将导致缓慢向下加载。

有没有更快的方法?

的此答案取决于瓶颈。尝试运行iostatmongostat以查看瓶颈位置。如果iostat显示高磁盘IO,那么您将被磁盘阻止。如果mongostat显示较高的“锁定百分比”,那么您最大限度地访问全局写入锁定。

如果你已经超出了IO,没有简单的代码修复。如果你已经写出了写锁,那么就没有简单的代码修复。如果这两个都不是问题,那么可能值得尝试另一个驱动程序。

据我所知mongoimport可以处理40K左右rec./sec(在同一台机器上)

这可能不是一个公平的比较,很多人一个新的数据库上运行mongoimport和数据一般只是加载到RAM中。

我会通过检查iostat/mongostat开始。

+0

这里是mongostat:http://pastebin.com/raw.php?i=Z92Abh2L这里是iostat:已http://pastebin.com/chaJF3L3什么是真正的 “高锁%”? –

+1

在'mongostat'上,你锁定的%'很低,只有大约17%。所以这不是数据库写入锁定。通常我运行'iostat -xkd 1'来获得IO使用的1秒间隔(用法显示为kB/s)。一个好的服务器驱动器应该是> 50 MB/s,所以看看是否阻止。这一步是'顶部'。如果你不是最大化IO并且你没有最大化Mongo的写入锁定,那么检查CPU。 (只有其他瓶颈我可以看到)唯一的其他选择是将更新命令写为“多”更新,但这并非总是可行。 –

相关问题