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
正是你在哪裏給用戶分配行固定呢? – 2014-12-03 09:41:17
我在將用戶對象添加到更新數組之前重新使用該用戶對象 – Dean 2014-12-04 13:51:19