2013-07-14 132 views
0

我的Rails應用程序中有以下代碼。MongoDB批量插入性能

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個記錄計算成蒙戈。我試着用

UserItem::Rating.collection.insert(ratings) 

UserItem::Rating.create(ratings) 

但它需要時間彙集到10^8條記錄插入到蒙戈。有沒有更好的/有效的方法將記錄插入到mongo中?

上下文:我使用它更像是存儲所有評級值的緩存存儲。當我顯示項目列表時,我只會從此緩存中讀取並顯示用戶提供的評分以及每個項目。

任何幫助非常感謝!

+0

我有一個類似的設置,因爲我爲產品的所有用戶存儲預測評級 - 我最終爲每個用戶存儲了一個文檔,其中item_ids的哈希值爲評估值。可能不太好,如果你一次只需要1或2個評分 –

+0

@FrederickCheung這是一個好主意!但在我的情況下,我需要的東西,1。給定一個用戶 - 我需要所有項目,他與評級和評級2.鑑於一個項目 - 我需要所有用戶與評級一起評級。 –

+0

您可以在多個驅動程序中一次插入多個文檔。您可能想要禁用寫入問題(因此它不會等待響應)。在插入過程中關閉索引... – WiredPrairie

回答

1

一種方法是存儲每個用戶一個文件,用收視率字段是項ID的用戶的哈希,例如

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

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

你必須使用字符串鍵的哈希值。這種方法並不容易檢索給定文檔的所有評級 - 如果你這麼做的話,可能會更容易爲每個項目存儲文檔。如果您一次只需要一小部分用戶的評分,那麼這也可能不是非常有效。

很明顯,您可以將其與其他方法結合使用以提高寫入吞吐量,例如批量插入或分割數據庫。

+0

謝謝@Frederick!會試試看! –