【问题标题】:Rails Admin: Usage of `has_and_belongs_to_many` causes huge memory usageRails 管理员:使用 `has_and_belongs_to_many` 会导致大量内存使用
【发布时间】:2020-12-03 13:13:53
【问题描述】:

编辑: 事实证明,所描述的情况不是内存消耗的根本原因。因此,我将关闭这个。很抱歉给您带来不便。

我正在使用 rails_admin 来管理数据库中的数据。 我在两个表之间存在 n 对 m 关系,这导致 rails_admin 应用程序为我要编辑的每个唯一 n 占用多达 150MB 的额外内存。

不用说,这很糟糕,感觉我做错了什么。

这是我的分支表:

class Branch < ApplicationRecord
  has_and_belongs_to_many :plant_state_bit_alarm,
                          class_name: 'Alarm',
                          join_table: :plant_state_bit_alarms
  # ...
  edit do
    # this causes the memory "hogging" - If I don't filter, it will hog anyway
    field :plant_state_bit_alarm do
      associated_collection_scope do
        branch = bindings[:object]
        Proc.new { |scope| scope = scope.where(branch_id: branch.id) if branch.present? }
      end
    end
  end

报警表:

class Alarm < ApplicationRecord
  belongs_to :branch
end

还有中间表:

class PlantStateBitAlarm < ApplicationRecord
  belongs_to :alarm
  belongs_to :branch

  rails_admin do
    visible false
  end
end

我的数据库中只有两个分支,但我的数据库中有许多警报(每个分支大约 35k)。当我想编辑任一分支时,应用程序的内存达到 700 MB 并且永远不会自行减少,导致生产服务器使用 OOM 杀手杀死我的应用程序。

现在有一个非常小的内存限制 (256MB),超过了我想要编辑其中一个分支的那一刻。我可以扩展它,但我担心它会成为我未来的问题,所以我宁愿现在就修复它。

我愿意接受处理此问题的建议,但我对 rails_admin 的了解仅涵盖 wiki 页面,这似乎更奇怪。我最担心的是内存根本没有被释放。

一些版本信息:

  • 红宝石:2.6.3
  • 导轨:5.0.7.2
  • rails_admin:1.4.2

(更新 rails 和 rails_admin 没有显示任何变化)

【问题讨论】:

    标签: ruby-on-rails ruby memory rails-admin


    【解决方案1】:

    我认为 rails 正在加载所有警报,这要归功于 class_name: 'Alarm' 参数。通常如果你想要这个设置,你需要像这样设置关联:

    class Branch < ApplicationRecord
      has_and_belongs_to_many :alarms, join_table: :plant_state_bit_alarms
    end
    

    这样,您甚至不需要 PlantStateBitAlarm 模型,除非您需要该关联中的特殊逻辑。

    然后您可以将警报字段添加到 Branch Rails 管理配置中,它可以让您添加警报并自动创建关联记录。

    【讨论】:

    • 嗯...不,它仍然会加载所有警报。但是这次我不能选择它们,因为我必须删除associated_collection_scope 位。
    • 原来还有一个与has_and_belongs_to_many无关的问题突然触发了更大的内存消耗。我将不得不提出另一个问题,但这仍然是为了您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    相关资源
    最近更新 更多