У меня есть приложение Rails, которое обрабатывает большое (миллионное) количество записей в базе данных mysql. Как только он начинает работать, его использование памяти быстро растет со скоростью 50 МБ в секунду. С помощью инструментов, таких как oink, я смог сузить корневую причину до одного цикла, который проходит через все записи в большой таблице в базе данных.
Я понимаю, что если я использую что-то вроде Person.all.each, все записи будут загружены в память. Однако, если я переключусь на find_each, я все еще вижу ту же проблему с памятью. Чтобы дополнительно изолировать проблему, я создал следующий тестовый контроллер, который ничего не делает, кроме прокрутки записей. Я полагаю, что find_each сохраняет только небольшое количество объектов в памяти каждый раз, но использование памяти растет линейно по мере ее выполнения.
class TestController < ApplicationController
def memory_test
Person.find_each do |person|
end
end
Я подозреваю, что это связано с кэшированием результатов запроса ActiveRecord. Но я проверил настройки своей среды, и у меня есть все связанные с кешированием параметры, установленные как false в разработке (я использую настройки по умолчанию, созданные рельсами). Я сделал поиск в Интернете, но не смог найти решение.
Я использую rails 3.1.0 rc1 и ruby 1.9.2
Спасибо!