Использование памяти Ruby / Rails - PullRequest
0 голосов
/ 16 сентября 2010

Эй, ребята, в следующем коде:

  def process(batch_size=1000)
     claim_numbers.each_slice(batch_size) do |numbers_batch|
       claims = Claim.find(:all, :conditions => ["claim_number in (?)", numbers_batch])
       # do something with claims
     end
   end

В одной из моих моделей Rails я много обрабатываю claim_numbers, я имитирую метод find_in_batches, чтобы не загружать много записей в память, , тогда мой вопрос : с точки зрения памяти, что происходит с переменной claims в каждой итерации? когда GC Ruby освобождает эту часть памяти?

Любая помощь и советы будут оценены, заранее спасибо!

Обновление: Использование Ruby 1.8.7-p72

1 Ответ

1 голос
/ 16 сентября 2010

Ruby освободит память, как только запустится GC.Так как заявка находится в пределах блока each_slice, заявка не будет иметь ссылки вне блока, и когда заявка переназначается (из-за следующей итерации), ранее назначенные объекты становятся не связанными.Память каждого объекта сохраняется до тех пор, пока не начнет работать GC. Как часто прогоны GC могут быть указаны с помощью некоторых переменных среды (дополнительная информация по адресу http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/).

Если по какой-то причине вы сохраняете объекты (посколькупо-прежнему ссылка на него (например, вы помещаете объекты в массив или хэш), память для этого объекта не освобождается. Если вы наблюдаете за своим приложением, вы можете увидеть увеличение использования памяти, но также и увеличение использования ЦП, поскольку ruby ​​GCне из поколения в поколение, что означает, что каждый раз он просматривает все объекты, чтобы узнать, можно ли их собрать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...