나는 명백한 이유없이 완료하기 위해 많은 시간이 걸리는 레이크 작업 (레일스 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를 사용했습니다)
나는 아이디어가 부족합니다. 아무도 도와 줄 수 있습니까? 내가 놓친 게 있니? 사전
코드를 읽는 것이 매우 어렵습니다. 제가 줄 수있는 가장 좋은 조언은 각 줄 앞에'puts '을 추가하여 문제가되는 줄을 식별하기 위해 어떤 인쇄가 멈추는 지 확인하는 것입니다 ... –