Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从方法返回大对象在生产环境中运行速度慢100倍_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 从方法返回大对象在生产环境中运行速度慢100倍

Ruby on rails 从方法返回大对象在生产环境中运行速度慢100倍,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有一个模型,我将一个相当大的序列化对象存储为它的一个属性 从下面的日志可以看出,将此对象从一个方法传递到另一个i生产环境时,需要花费100倍的时间才能精确 奇怪的是,它并不发生在开发环境中,只发生在生产环境中。它也发生在ajax请求期间,但不确定是否相关 这是调用该方法的一段代码 now = Time.now price_document = self.applied_price_document Rails.logger.info "cp_id: #{self.id

我有一个模型,我将一个相当大的序列化对象存储为它的一个属性

从下面的日志可以看出,将此对象从一个方法传递到另一个i生产环境时,需要花费100倍的时间才能精确

奇怪的是,它并不发生在开发环境中,只发生在生产环境中。它也发生在ajax请求期间,但不确定是否相关

这是调用该方法的一段代码

    now = Time.now
    price_document  = self.applied_price_document
    Rails.logger.info "cp_id: #{self.id} self.try :applied_price_document (2) #{Time.now - now} "
记录为1.06秒

然后,我尝试用该方法记录每条指令,以找到瓶颈,结果发现从日志中看不到瓶颈

  def applied_carrier_product
    start = Time.now
    ancestors = CarrierProduct.find_carrier_product_ancestors(carrier_product_id: self.id).includes(:carrier_product_price).references(:carrier_product_price)

    parent    = ancestors.select{ |cp| cp.id == self.carrier_product_id }.first
    until parent.nil? || ancestors.empty?
      is_successful = parent.carrier_product_price.try('successful?')

      if is_successful
        Rails.logger.info "cp_id: #{self.id} end #{Time.now - start} "
        return parent.carrier_product_price
      end

      parent = ancestors.select{ |cp| cp.id == parent.carrier_product_id }.first

    end
  end
在返回结果之前,我记录了方法的总运行时间,结果为0.002秒

这意味着将结果传递给调用方法大约需要1秒的时间。考虑到我连续调用这个方法多达30次,这是一个大问题


你知道为什么会这样吗?

任何人都无法给你一个像样的答案,解释为什么这个问题发生在一个环境而不是另一个环境中。有太多的变量,我们都不能在这里检查。您的dev和prod数据库是否包含相同数量的数据?我会从祖先开始;您可能会在那里实例化数千个Ruby对象——这不太好。这可能是在数据库查询中应该做的事情。它永远不会超过2/3个对象,而且,正如日志所证明的,这不是罪魁祸首。当通过极不可能的返回语句将信息从一个方法传递到另一个方法时,会发生减速。我建议安装分析工具,例如,以便获得比几个时间戳日志项所能提供的更详细、更可靠的信息。事实证明,当从模型“record.price_document”访问序列化对象时,速度会减慢,其中price_document是大对象,因此反序列化是瓶颈?我们说的有多大?您使用什么数据库,以及如何序列化/反序列化对象?你跑什么?