CSV 生成速度慢得可怕
Dreadfully slow CSV generation
前言:我们正在努力升级我们的应用程序 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 秒)现在。
非常感谢help/guidance。
使用 "standard" 时遇到 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 的影响
制作简单的数据库转储时不需要它
解决方案是在绕过 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 秒的原因是什么
希望对您有所帮助
前言:我们正在努力升级我们的应用程序 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 秒)现在。
非常感谢help/guidance。
使用 "standard" 时遇到 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 的影响 制作简单的数据库转储时不需要它
解决方案是在绕过 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 秒的原因是什么
希望对您有所帮助