【问题标题】:Rendering large amounts of ActiveRecord objects in Rails在 Rails 中渲染大量 ActiveRecord 对象
【发布时间】:2012-04-03 14:16:43
【问题描述】:

我有一些 Rails 控制器操作以这种方式响应 AJAX 请求:

books = Book.all
render :json => { :books => books }

这应该相对较快,但需要 5 秒以上,这对于网络上的任何请求来说都太长了。日志如下所示:

Completed 200 OK in 5212ms (Views: 2679.7ms | ActiveRecord: 147.7ms)

我不明白当我不渲染到视图文件时如何在“视图”中花费 2.6 秒,或者总共如何花费 5212 毫秒。什么需要这么多时间,如何加快速度?

编辑:在这个特定请求中返回了大约 1000 本书,我猜每本书大约有 1kb 的数据。编辑 2:查看控制台中的响应,响应的大小为 973kb。

【问题讨论】:

  • 一共有多少本书?反响有多大?
  • 你试过respond_with(Book.all)吗?
  • 不,我没试过。由于某种原因它更快吗?我现在就去读。
  • 除了 rails 的内部构建器之外,您还可以尝试其他一些 json 构建器。他们可能会更快。可能是 Rails 的内部 json 构建器在设计上很慢。
  • 为什么没有人阅读原始问题?看看他的 ActiveRecord 时间(148 毫秒)与查看渲染时间(2700 毫秒。差不多 3 秒!)。这不是数据访问性能问题,而是 JSON 渲染的性能问题。

标签: ruby-on-rails ruby-on-rails-3 json performance activerecord


【解决方案1】:

您是否尝试过oj 以获得更快的 json 生成?据其作者称:

到目前为止,它的解析速度比 Yajl 快 2 倍,编写 JSON 的速度比 Yajl 快 3 倍或更多。

也许是一个好的解决方案?

【讨论】:

    【解决方案2】:

    参见章节 1.3 批量检索多个对象:http://goo.gl/UR5B

    另外,您可能想研究一下预先加载记录。

    【讨论】:

    • 从他的日志输出中可以看出,ActiveRecord 部分花费的时间很少。所有的视图渲染都在扼杀性能。似乎 Rails 在将大型对象呈现为 JSON 时会感到窒息。我在我正在进行的项目中看到了类似的问题。
    【解决方案3】:

    一旦您预加载了所有用于呈现视图的模型,您就可以优化 JSON 的生成。你上面的东西(render :json => {:books => books})不是很快。

    看看这个问题:What is the fastest way to render json in rails

    并考虑切换到呈现 JSON 的不同方式。

    【讨论】:

    • 如果你想让它变得非常快并且你的书不经常改变,你可以缓存结果,但那是另一个问题/方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2012-11-17
    • 2014-07-10
    相关资源
    最近更新 更多