【问题标题】:Ways to avoid memory bloat in rails when instantiating a large number of objects?实例化大量对象时避免rails中内存膨胀的方法?
【发布时间】:2019-03-22 13:29:43
【问题描述】:

我有一个 Ruby on Rails 应用程序,它加载数千个地图标记并使用 Google Maps API 在地图上显示它们。视图中的所有标记都是必需的,因此它们必须由控制器加载并显示。

因此,每次用户加载他们的地图时,我都会分配大量内存,因此当我超过 500MB 内存限制时,Heroku 中经常遇到“R14 - Ruby 中超出内存配额 (MRI)”错误。

我通过使用较少的数据密集型查询优化了我的代码,例如使用:

@user.markers.select(:coordinates) 

相对于:

@user.markers

然而,由于我正在加载的对象的原始数量(有时每个用户在地图上超过 2,000 到 3,000 个),我仍在实例化大量内存。由于多个用户提出类似的请求,我很快就完成了500MB 内存。

这是否意味着我只需要为我的 Heroku 实例分配更多内存,或者在这种情况下是否有其他方法可以减少内存使用量?

【问题讨论】:

    标签: ruby-on-rails heroku memory


    【解决方案1】:

    您应该尝试pluck 而不是select,这不会给您对象,只是数组中的字段。这应该有助于你的记忆状况。 Check out the docs for more info.

    【讨论】:

    • 感谢@dwhite 我使用了 pluck 并节省了一些内存,我很欣赏这个建议。也就是说,即使在减少内存占用时,我仍然会为每个地图请求添加约 70MB。解决方案可能只是完成我从 Heroku 获得更多 RAM 的计划。
    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多