我有一個rake任務(Rails的3/Mongoid),其需要花費大量的時間來完成,沒有明顯的原因,我的猜測是,我做的事情多次,它是沒有必要的,或者我」中號失去了一些東西很明顯(我沒有MongoDB的或Mongoid專家):格外緩慢導入任務
task :fix_editors => :environment do
(0...50).each do |num|
CSV.foreach("foo_20141013_ascii.csv-#{num}.csv", col_sep: ";", headers: true, force_quotes: true) do |row|
editors = Hash[*Editor.all.collect {|ed| [ed.name, ed.id]}.flatten]
begin
book = Book.where(internal_id: row["ID"], editorial_data_checked: false).first
if book && !row["Marchio"].nil?
editor_name = HTMLEntities.new.decode(row['Marchio']).strip.titleize
editor_id = editors[editor_name]
unless editor_id
editor = Editor.create(name: editor_name)
editors[editor_name] = editor.id
editor_id = editor.id
end
if book.update_attributes(editor_id: editor_id, editorial_data_checked: true)
puts "#{book.slug} updated with editor data"
else
puts "Nothing done for #{book.slug}"
end
end
rescue => e
puts e
retry
end
end
end
end
的CSV我在開始閱讀是非常大的,所以我在50個小文件將其分割(這是我的首先嚐試加快速度)。
然後我試圖刪除我可以在所有查詢,這就是爲什麼它不從編輯採集讀取每一行,但收集所有的人都在開始,然後就查找的東西在一個散。
最後,我刪除了所有保存調用並使用了update_attributes。
藏書或多或少100萬條記錄,所以這是相當大的。我有13萬位編輯,所以沒有什麼大不了的。
這裏是我的書類:
https://gist.github.com/anonymous/087e6c81ef5f355a160d
本地需要每行1秒以上,我不認爲這是正常的,但隨時讓我知道如果你不同意。所有的寫操作採取小於0.1/0.2(我用Benchmark.measure)
我的想法,任何人可以幫助我嗎?我錯過了什麼嗎?在此先感謝
這是很難通過閱讀代碼的說 - 我能給的最好的建議是增加'放「每行前做XXX'',看看什麼打印掛起,以確定問題的行... – 2014-11-04 12:26:12