我有一个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万条记录,所以它非常大。我有13k编辑,所以那里没什么大不了的。
这是我的Book课程:
https://gist.github.com/anonymous/087e6c81ef5f355a160d
本地每行需要1秒以上,我觉得这不正常,但如果你不同意,请随时告诉我。所有写入都少于0.1 / 0.2(我使用过Benchmark.measure)
我没有想法,任何人都可以帮助我吗?我错过了什么吗?提前致谢
答案 0 :(得分:1)
替换
editors = Hash[*Editor.all.collect {|ed| [ed.name, ed.id]}.flatten]
到
之后的第二行task :fix_editors => :environment do
您可以进行批处理的其他事情:加载1000行,然后加载1000本书,然后处理这1000本书
答案 1 :(得分:0)
您对books表的column_id列有索引吗?