많은 레이크 작업 (상인이라고 함)을 통해 반복적으로 작업해야하는 레이크 작업이 있습니다. 내 문제는 레일스가 자동으로 DB 쿼리 결과를 캐싱하기 때문에 결국에는 스태프 공간에 작업자를 배치하기 시작합니다. '항목'을 통해 각 시간의 값을 캐싱하지 않고레일즈가 ActiveRecord 쿼리 결과를 캐시하지 못하도록하기
Merchant.all.each { |m| items = m.items }
: 한마디로
, 나는 같은 명령을 실행하는 방법을 궁금하네요.Merchant.all.each do |m|`
ActiveRecord::Base.connection.uncached do
items = m.items
end
end
나는 또한 나의 상인 모델이 추가 시도했다 : :
나는 해봤 대신 items_uncached 호출 후
def items_uncached
self.class.uncached { items }
end
하고,하지만, 난 여전히까지 건 드리는 결국 내가 액세스하는 각각의 새로운 항목 세트로 메모리 사용량.
저는 레일즈 2.3.10, 루비 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