在Ruby中,将非常大的局部变量复制到实例变量会重复内存需求

时间:2015-09-13 18:21:04

标签: ruby-on-rails ruby heroku

我将一些非常大的多维哈希传递给报表视图。因为我正在使用Heroku,所以我在运行内存分配。因为我必须复制这些变量来传递它们,所以我将这个要求加倍。我正在寻找使用Redis来存储和访问变量,但这是一项重大的工作。在传递这些变量时我是否缺少某些东西,以至于我不会在过程中复制它们?

来自report.rb的电话是:

message = KacMailer.daily_report(@associates, @managers, @assoc_wi_mgr, @assoc_sort, @issues, @items, @keys)

然后kac_mailer复制变量以将它们传递给报表视图:(编辑:将局部变量添加到nil)

  def daily_report(associates, managers, assoc_wi_mgr, assoc_sorted, issues, items, keys)
    @associates   = associates
    associates    = nil
    @managers     = managers
    managers      = nil
    @assoc_wi_mgr = assoc_wi_mgr
    assoc_wi_mgr  = nil
    @assoc_sorted = assoc_sorted
    assoc_sorted  = nil
    @issues       = issues
    issues        = nil
    @items        = items
    items         = nil
    @keys         = keys
    keys          = nil

    support_mail = mail(to: $kac.support, subject: 'Daily Report', from: $kac.support) do |format|
      format.html { render 'kac_mailer/daily_report' }

    end
  end

2 个答案:

答案 0 :(得分:0)

最后,变量没有重复,只是获得了一个新的指针。这意味着内存需求很难解决。哈希非常复杂,它们的创建和动态使用,即使是Redis也是一个难以解决的问题。在价格/性能方面,我最好的选择就是通过增加Heroku Scheduler中动态工作器dyno的大小来增加可用内存。这很简单,工作得很好。

答案 1 :(得分:0)

这里没有重复,只是引用 - 不会复制数据。

重复意味着创建大型结构的克隆/副本。再次引用数据只会添加新引用。

相关问题