创建许多新对象时内存膨胀

Mor*_*rgz 9 ruby memory-management ruby-on-rails

当我运行它然后在OSX活动监视器中观察我的ruby进程的内存消耗时,内存增加大约3 MB/s.

如果我删除了事务,它将内存消耗减半,但仍然会增加内存占用.我的生产应用程序中存在一个问题,Heroku因其内存消耗而导致该进程死亡.

有没有一种方法可以做到这一点,以一种不会增加记忆的方式?如果我注释掉那条.save线那么它没关系,但当然这不是解决方案.

ActiveRecord::Base.transaction do
  10000000.times do |time|
    puts "---- #{time} ----"
    a = Activity.new(:name => "#{time} Activity")
    a.save!(:validate => false)
    a = nil
  end
end
Run Code Online (Sandbox Code Playgroud)

我正在使用它delayed_job.

Mat*_*tty 5

a = nil行是不必要的,您可以删除它。

每次循环时,您都会创建很多对象-两个字符串,两个散列和一个Activity对象,因此您遇到高内存使用率并不感到惊讶,尤其是当您循环一千万次时!似乎没有更有效的内存方式来编写此代码。

我能想到的减少内存使用的唯一方法是每x次迭代手动启动垃圾回收器。Ruby的GC可能不够积极。但是,您不想每次迭代都调用它,因为这将从根本上减慢您的代码的速度。也许您可以将每100次迭代作为起点,然后从那里开始。您必须分析并测试最有效的方法。

GC的文档在这里