可怕的CSV生成速度很慢

时间:2015-04-10 17:57:39

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

前言:我们正在努力升级我们的应用程序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秒)。

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

1 个答案:

答案 0 :(得分:2)

使用&#34;标准&#34;时出现慢速CSV导出存在同样的问题 csv dump

看起来像这样:

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的性能受到了影响 在进行简单的数据库转储时不需要它

解决方案是在绕过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秒

希望有所帮助