2014-11-04 1 views
0

나는 명백한 이유없이 완료하기 위해 많은 시간이 걸리는 레이크 작업 (레일스 3/몽고 이드)이 필요합니다. 내 추측은 내가 필요하지 않은 곳에서 여러 번 뭔가하고 있다는 것입니다. (I 더 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 개 작은 파일에 분할 한 (즉이었다 내 먼저 속도를 높이려고 시도).

그런 다음 모든 쿼리를 제거하려고 했으므로 모든 행에 대해 Editor 컬렉션에서 읽지 않고 처음부터 모두 수집 한 다음 해시를 조회합니다.

결국 모든 저장 호출을 제거하고 update_attributes를 사용했습니다.

도서 컬렉션은 거의 1 백만 개의 레코드이므로 꽤 큽니다. 나는 13k 편집자가 있으므로 큰일이 아니다.

https://gist.github.com/anonymous/087e6c81ef5f355a160d

로컬로는 행당 1 초 이상 소요

, 나는 그것이 정상이라고 생각하지만, 당신이 동의하지 않는 경우 알려 주시기하지 않습니다

여기 내 예약 클래스입니다. 모든 글은 0.1/0.2보다 적게 걸립니다. (Benchmark.measure를 사용했습니다)

나는 아이디어가 부족합니다. 아무도 도와 줄 수 있습니까? 내가 놓친 게 있니? 사전

+0

코드를 읽는 것이 매우 어렵습니다. 제가 줄 수있는 가장 좋은 조언은 각 줄 앞에'puts '을 추가하여 문제가되는 줄을 식별하기 위해 어떤 인쇄가 멈추는 지 확인하는 것입니다 ... –

답변

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)]'이 일을해야합니다. 그러나 이것이 단지 50 번만 실행되기 때문에 이것이 문제가 아니라고 생각합니다. – ThomasSevestre

+0

@ThomasSevestre 아니오, 각 파일의 행 수를 50 배로 늘림 – fl00r

+0

실제로 각 행마다이 작업을 수행 할 이유가 없습니다 ... – ThomasSevestre

0

books 테이블의 internal_id 열에 대한 색인이 있습니까?

+0

모델로 선언되었습니다. https://gist.github.com/anonymous/087e6c81ef5f355a160d – fl00r