MongoDB批量插入性能

时间:2013-07-14 08:57:28

标签: 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用户和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)

UserItem::Rating.create(ratings)

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

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

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

一种方法是为每个用户存储一个文档,其中的评级字段是项目ID对用户的哈希值,例如

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

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

您必须使用字符串键作为哈希。这种方法无法轻松检索给定文档的所有评级 - 如果您这样做很多,则可能更容易为每个项目存储文档。如果您一次只需要一小部分用户的评分,那么它也可能效率不高。

显然,您可以将此与其他方法结合使用,以提高写入吞吐量,例如批量插入或分片数据库。