实例化大量对象时如何避免导轨中的内存膨胀?

时间:2018-10-17 19:19:37

标签: ruby-on-rails heroku memory

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

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

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

@user.markers.select(:coordinates) 

相对于:

@user.markers

但是,由于我正在加载的对象的原始数量(每位用户在地图上有时超过2,000-3,000),我仍在实例化大量内存。随着多个用户提出类似的请求,我很快就积累了更多的内存500MB的内存。

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

1 个答案:

答案 0 :(得分:2)

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