【问题标题】:Dreadfully slow CSV generationCSV 生成速度非常慢
【发布时间】:2015-04-10 17:57:38
【问题描述】:

前言:我们正在努力升级我们的应用程序 Ruby 和 Rails 版本,但需要使用我们目前的工作。

我们的 RoR 应用具有将数据导出为 CSV 的功能。

我们最近升级到 Ruby 1.8.7、Rails 3.1,这个 CSV 输出的性能下降得令人难以置信。我们正在谈论大约 2000 条记录的时间,这似乎有点荒谬。

此外,当处理对此的请求时,它基本上会关闭服务器以处理对该应用程序和其他应用程序的其他请求。

我有:

  • 从 CSV 升级到 FasterCSV gem(没有区别,甚至更慢!)
  • 确保我们在 AR 查询中预先加载所有可能的内容
  • 已验证不是查询时间,而是对 FasterCSV 的实际调用以从 AR 集合生成 CSV,这占用了绝大多数响应时间

我很确定,使用 Ruby 1.9.x 和更高版本的 Rails 会带来更好的性能,但现在确实需要能够达到可接受的响应时间(至少小于 30 秒)。

非常感谢任何帮助/指导。

【问题讨论】:

    标签: performance csv ruby-on-rails-3.1 ruby-1.8.7


    【解决方案1】:

    在使用“标准”时遇到同样的问题,即 CSV 导出缓慢 csv转储

    看起来像这样:

    CSV.generate do |csv|
      csv << self.column_names
    
      self.all.find_in_batches(:batch_size => 10000).with_index do |batch,batch_index|
        puts (self.model_name.human.to_s + ": batch " + batch_index.to_s)
        batch.each do |row|
          csv << row.attributes.values_at(*column_names)
        end
      end
    end
    

    不幸的是,使用批处理没有帮助。 我注意到 Rails ActiveRecord 损害了性能 制作简单的数据库转储时不需要这样做

    解决方案是在绕过创建活动记录对象的同时使用 select_all SQL 查询,如下所示:

    CSV.generate do |csv|
      csv << self.column_names
      self.connection.select_all("select * from #{self.table_name}").each do |row|
        csv << row.values
      end
    end
    

    在一个非常基本的服务器上导出大约 130K 行的性能从 120 秒显着提高到大约 2 秒

    希望对你有帮助

    【讨论】:

    • SQL 查询如何与活动记录关联(父 子)一起使用?非常感谢!
    • @CottonEyeJoe 您必须修改 SQL 查询以在子表或父表上使用左连接或内连接,以便从那里显示数据,遗憾的是没有简单的解决方案
    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2016-10-10
    • 2012-11-05
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多