【问题标题】:Rails timing out too many records to receive or access at onceRails 超时接收或访问太多记录
【发布时间】:2020-12-16 17:42:40
【问题描述】:

我目前正在处理一个报告接收过多信息并导致后续加载超时或需要很长时间才能加载所有必要数据的问题。当前函数当前正在使用 find 方法,据我所知 find_by_batches 可能对此更好,但我不确定这是如何实现的,我当前的 find 正在对数组键进行操作。我的意图仍然是获取数据,但可能会对其进行批处理,以便更快地加载。下面是嵌套数组的 sn-p 和示例。该问题发生在嵌套的消费者哈希中,该哈希具有许多具有对应键/值的个人消费者记录。

module Reports
  class GroupsController < ::ApplicationController

    def consumers
      @group = Group.find(consumer_params[:group_id])
    end

    private

    def consumer_params
      params.permit(:group_id)
    end
  end
end

Group : {
   key1: value
   key2: value
   key3: value 
   key4: value
   key5: value
}, 
 consumers: {
     {
       key:value
       key:value
       key:value
     },      
     {
       key:value
       key:value
       key:value
     }, etc...
   }
}

【问题讨论】:

  • 是什么让您相信Group.find(consumer_params[:group_id]) 电话是您的根本问题? consumer_params[:group_id] 是什么?为什么单个.find 调用会成为您问题的根源?
  • 这是一个公平的观点,我假设找到是问题所在,因为它返回的数据集最多可以有 9000 条记录。因此,它会导致加载时间过长或超时。
  • 再次,consumer_params[:group_id] 是什么?如果它是一个整数,那么.find 应该返回一条记录。也许它不是整数?也许它是一个数组?
  • 它不返回整数。 Group_id 返回具有 5 个键和 1 个嵌套数组的组,其中包含所有消费者。我将添加一个示例。
  • 看来您可能遇到了 N+1 问题,这将有助于了解您对 @group 所做的工作

标签: ruby-on-rails ruby sqlite activerecord find


【解决方案1】:

Jvillian 最初是正确的,我的发现不是问题,因为查询不会导致任何加载问题。在测试不同的循环之后,所有的时间都是相似的。问题在于显示如此庞大的数据集。

Pagination 利用 Kaminari 和 API-Pagination gems 解决了这个问题。利用以下代码,我可以将列表分成每页 500 个消费者的页面。

module Reports
  class GroupsController < ::ApplicationController

    def consumers
      @group = Group.find(consumer_params[:group_id])
      @consumers = @group.consumers
      paginate_json: @consumers, per_page: 500
    end

    private

    def consumer_params
      params.permit(:group_id)
    end
  end
end
json.conference @group, partial: 'group', as: :group
json.attendees @consumers, partial: 'consumer', as: :consumer

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多