序文:私たちは、RubyとRailsのバージョンのアプリケーションをアップグレードするために懸命に働いていますが、現時点での作業に取り組む必要があります。
RoRアプリケーションでは、データをCSVにエクスポートする機能があります。
最近、Ruby 1.8.7、Rails 3.1にアップグレードしました。このCSV出力のパフォーマンスは非常に遅くなりました。私たちは約2000レコードのために1分以上話していますが、ちょっとばかばかしいようです。
また、これに対するリクエストが処理されている場合、基本的にこのアプリや他のリクエストに対する他のリクエストのためにサーバがダウンします。
私は持っています:
- CSVからFasterCSV gemにアップグレードされました(違いはなく、さらに遅くなりました!)
- 私たちがARクエリで可能なすべてのことを熱心に実行していることを確認しました
- それがクエリ時間ではないことを確認しましたが、ARコレクションからCSVを生成するFasterCSVへの実際の呼び出しは、応答時間の大部分を占めています
私は、Ruby 1.9.x以上のRailsバージョンを使用することでより良いパフォーマンスが得られると確信していますが、現在では許容可能な応答時間(<30秒、少なくとも)を達成する必要があります。
どんな助けや指導も大変感謝しています
回答:
回答№1は2「標準」のアプリケーションを使用しているときに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
バッチを使用して残念なことにdidn "t助けてください。 私は、パフォーマンスがRails ActiveRecordによって傷ついていたことに気づいた シンプルなDBダンプを作成する際には不要です
このソリューションは、以下のように、active_recordオブジェクトの作成をバイパスしながら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秒に大幅に向上させた
それが役に立てば幸い