2014-12-03 12 views
0

我目前使用SmarterCSV通過MongoDB的upsert命令執行批量CSV導入。我有以下代碼摘錄:Rails重用對象以批量導入節省內存

SmarterCSV.process(csv, csv_options) do |chunk| 
    chunk.each do |row| 
     #creates a temporary user to store the object 
     user = User.new 
     #converts row info to populate user object 
     #creates an array of commands that can be executed by MongoDB via user.as_document 
       updates << {:q => {:email => user.email}, 
          :u => {:$set => user.as_document}, 
          :multi => false, 
          :upsert => true} 
     user = nil 
    end 
    end 

不過,我注意到,內存使用不斷增加的垃圾收集(使用Rails 3.2.14 &紅寶石2.0.0p353)似乎並不清除臨時user對象足夠快。

因此,我試圖在SmarterCSV過程之外創建user = User.new過程(請參見下文),並在過程中重新使用user對象。這節省了內存。但是,user.as_document將在每次迭代中覆蓋updates陣列中的先前元素。我能夠通過使用user.as_document.to_json來解決問題,但是這並沒有正確設置User的任何關係。例如,不是爲一個關係的ID保存一個BSON引用,而只是將該ID保存爲字符串格式。

任何想法?有沒有辦法可以優化批量導入過程?

user = User.new 
SmarterCSV.process(csv, csv_options) do |chunk| 
    chunk.each do |row| 
     #creates a temporary user to store the object 
     #converts row info to populate & reuse user object 
     #creates an array of commands that can be executed by MongoDB via user.as_document.to_json 
       updates << {:q => {:email => user.email}, 
          :u => {:$set => user.as_document.to_json}, 
          :multi => false, 
          :upsert => true} 
    end 
    end 
+0

正是你在哪裏給用戶分配行固定呢? – 2014-12-03 09:41:17

+0

我在將用戶對象添加到更新數組之前重新使用該用戶對象 – Dean 2014-12-04 13:51:19

回答

0

我最終用「user.as_document.deep_dup」