Ruby on rails MongoDB批量插入性能

Ruby on rails MongoDB批量插入性能,ruby-on-rails,ruby,ruby-on-rails-3,mongodb,mongomapper,Ruby On Rails,Ruby,Ruby On Rails 3,Mongodb,Mongomapper,我的rails应用程序中有以下代码 module UserItem class Rating include MongoMapper::Document key :user_id, Integer, :required => true key :item_id, Integer, :required => true key :rating, Float, :required => true end end 我有大约10K个用户和10

我的rails应用程序中有以下代码

module UserItem
  class Rating
    include MongoMapper::Document
    key :user_id, Integer, :required => true
    key :item_id,  Integer, :required => true
    key :rating, Float, :required => true 
  end
end
我有大约10K个用户和10K个项目,我需要存储每个项目的每个用户的评级,大约是10^8个记录。我已将10^8条记录的值计算到一个数组中,如下所示

ratings = [
  {user_id: 1, item_id: 1, rating: 1.5}, 
  {user_id: 1, item_id: 2, rating: 3.5},
  ... and so on 10^8 records
]
现在,我需要将所有这些计算出的10^8条记录插入mongo。我试过了

UserItem::Rating.collection.insert(ratings)

但将10^8条记录插入mongo需要几个小时。有没有更好/更有效的方法将记录插入mongo

上下文:我使用它更像是存储所有评级值的缓存存储。当我显示项目列表时,我将仅从该缓存读取数据,并在每个项目旁边显示用户提供的评级


非常感谢您的帮助

一种方法是为每个用户存储一个文档,例如,使用一个分级字段,该字段是对用户的项目ID的散列

class UserRating
  include MongoMapper::Document
  key :ratings
  key :user_id
end

UserRating.create(:user_id => 1, :ratings => {"1" => 4, "2" => 3})
必须为哈希使用字符串键。这种方法不便于检索给定文档的所有评分-如果您经常这样做,则可能更容易存储每个项目的文档。如果你一次只需要一小部分用户的评分,那么它也可能不是很有效


显然,您可以将其与其他提高写入吞吐量的方法相结合,例如批处理插入或分割数据库

我有一个类似的设置,我为所有用户存储产品的预测评级-我最终为每个用户存储了一个文档,该文档将项目ID散列到评级值。如果你一次只需要1到2个评级,可能就不太好了time@FrederickCheung这是个好主意!但就我而言,我需要这两样东西,1。给定一个用户-我需要所有项目,他与评级和2评级。给定一个项目-我需要所有对其进行评级的用户以及评级。您可以在多个驱动程序中一次插入多个文档。您可能希望禁用写关注点(这样它就不会等待响应)。在插入过程中关闭索引…谢谢@wiredparie!我将尝试以下方法1。禁用写关注点2。禁用索引。分片是一种方法还是共享不是一种方法?如果你有多台服务器,分片应该通过分发写入来帮助你。谢谢@Frederick!我会试试看!
class UserRating
  include MongoMapper::Document
  key :ratings
  key :user_id
end

UserRating.create(:user_id => 1, :ratings => {"1" => 4, "2" => 3})