それぞれが多数の関連項目を持つ多数のレコード(Merchants)を反復処理する必要があるレーキタスクがあります。私の問題は、Railsが自動的にDBクエリの結果をキャッシュするため、私は非常に長い間、スワップスペースに従業員を入れることになります。 「アイテム」を介して各時間の値をキャッシュせずにRailsがActiveRecordクエリの結果をキャッシングできないようにする
Merchant.all.each { |m| items = m.items }
:要するに
は、私のようなコマンドを実行する方法を思ったんだけど。私が試した:
Merchant.all.each do |m|`
ActiveRecord::Base.connection.uncached do
items = m.items
end
end
を、私はまた私の商人モデルにこれを追加しようとしました:
def items_uncached
self.class.uncached { items }
end
して、代わりにitems_uncachedを呼び出して、私はまだラッキング終わります私がアクセスする新しいアイテムのそれぞれのセットでのメモリ使用量。
私はRails 2.3.10、Ruby 1.9.2を実行しており、Mysqlをストレージとして使用しています。
あなたのご意見をお寄せいただきありがとうございます!
*編集:
ここで私が働いているコードの実際のビットがあります:
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
いくつかのエラーチェックをやろうとした後、結果をログに記録します。
あなたがしようとしていることはあまり明確ではありません。おそらく、ActiveRecord :: Base#find_eachのようなものを探しているのでしょうか? – coreyward
ええ、ええ、私はfind_eachを見て、それは実際に役立つかもしれません。私はそれを試してみます。 – peter
少し上手く表現するために、コンソールでこのコードを実行すると、Merchant.all.each {| m | items = m.items; print "#{m.id}"}、各繰り返しでメモリ使用量にバンプがあります。これは、m.itemsが1〜10,000 + ActiveRecordsの間にあるためです。 – peter