У меня есть задача граблей, которая должна проходить через большое количество записей (называемых торговцами), каждая из которых имеет большое количество связанных элементов.Моя проблема в том, что из-за того, что Rails автоматически кеширует результаты моих запросов к БД, я в конечном итоге очень быстро помещаю своих работников в пространство подкачки.
Короче, мне интересно, как выполнить такую команду:
Merchant.all.each { |m| items = m.items }
без кэширования значения 'items' каждый раз через.
Я пробовал:
Merchant.all.each do |m|
ActiveRecord::Base.connection.uncached do
items = m.items
end
end
и у меня естьтакже попытался добавить это к моей модели Merchant:
def items_uncached
self.class.uncached { items }
end
и затем вместо этого вызвать items_uncached, но я все равно заканчиваю тем, что увеличивал использование памяти с каждым новым набором элементов, к которым у меня есть доступ.Я использую Rails 2.3.10, Ruby 1.9.2 и использую Mysql для хранения.
Заранее спасибо за ваши мысли!
*** edit:
Вот этоФактический фрагмент кода, над которым я работаю:
File.open(output, "w") do |f|
Merchant.all.each do |m|
items = m.items
invalid_image_count = 0
items.each do |i|
invalid_image_count += 1 unless i.image_valid?
end
invalid_categories = items.select { |i| !i.categories_valid? }.count
f.puts "#{m.name} (#{m.id}): #{invalid_image_count} invalid images, " +
"#{invalid_categories} invalid categories"
end
end
Попытка выполнить некоторую проверку ошибок и затем записать результаты.