2014-11-04 69 views
0

我有一個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)

我的想法,任何人可以幫助我嗎?我錯過了什麼嗎?在此先感謝

+0

這是很難通過閱讀代碼的說 - 我能給的最好的建議是增加'放「每行前做XXX'',看看什麼打印掛起,以確定問題的行... – 2014-11-04 12:26:12

回答

1

更換

editors = Hash[*Editor.all.collect {|ed| [ed.name, ed.id]}.flatten] 

到第二行權後

task :fix_editors => :environment do 

,你可以做批量處理其他的事情:負荷1000行,那麼1000名的書籍,然後再處理那些1000本書

+0

'編輯=散列[Editor.pluck(:name,:id)]'應該完成這項工作。但我不認爲這是因爲它只有在每個文件 – ThomasSevestre 2014-11-04 13:08:20

+0

@ThomasSevestre沒有,乘50次的問題,顯然沒有理由這樣做,每行... – fl00r 2014-11-04 13:09:33

+0

事實上的行數執行50次 – ThomasSevestre 2014-11-04 13:13:42

0

你有沒有索引書籍的列表internal_id?

+0

它在模型中聲明https://gist.github.com/anonymous/087e6c81ef5f355a160d – fl00r 2014-11-04 13:09:54