前提・実現したいこと
Rails5でCSVダウンロードを作っています。
10万件超のデータをメモリ負荷を考慮してCSVエクスポートしたいです。
発生している問題・エラーメッセージ
puma-worker-killer
にメモリ不足でプロセスを切られてしまいます。
該当のソースコード
ruby
1class ExportsController < ApplicationController 2 def index 3 items = Item.all 4 render_csv(items) 5 end 6 7 def render_csv(records) 8 filename = "Item_#{Time.current.to_i}.csv" 9 self.response.headers['Content-Type'] ||= 'text/csv; charset=Shift_JIS' 10 self.response.headers['Content-Disposition'] = "attachment;filename=#{filename}" 11 self.response.headers['Content-Transfer-Encoding'] = 'binary' 12 self.response.headers['Last-Modified'] = Time.current.ctime.to_s 13 14 self.response_body = Enumerator.new do |y| 15 names = Item.csv_column_names 16 y << encode_sjis(names.values.to_csv) 17 18 records.find_in_batches do |group| 19 group.each do |record| 20 values = record.csv_column_values 21 y << encode_sjis(values.map{|k, v| v.call(record)}.to_csv) 22 end 23 GC.start 24 Rails.logger.info "memory using #{ObjectSpace.memsize_of_all * 0.001 * 0.001} MB" #追記 25 end 26 end 27 end 28end
試したこと
render_csvの中でfind_each
やfind_in_batches
を500件や100件ずつで試してみましたが、状況は変わらず。
追記
■コードに追加した内容
Rails.logger.info "memory using #{ObjectSpace.memsize_of_all * 0.001 * 0.001} MB"
■以下、tail -f development.log | grep --line-buffered "memory using"の結果です。
memory using 368.840598 MBでpuma-worker-killerが発動しています。
memory using 185.512727 MB memory using 236.11603 MB memory using 218.543507 MB memory using 249.18884 MB memory using 258.381909 MB memory using 238.562832 MB memory using 325.655192 MB memory using 320.25811200000004 MB memory using 286.946893 MB memory using 313.74037 MB memory using 276.651044 MB memory using 296.949558 MB memory using 311.553982 MB memory using 302.603379 MB memory using 333.15229800000003 MB memory using 352.51917 MB memory using 368.840598 MB
追記2
■Rails.logger.infoの前にGC.startを追加した後のメモリ使用量
先程に比べるの一定してメモリが増えるようになりました。
memory using 173.27937400000002 MB memory using 211.016275 MB memory using 218.16826200000003 MB memory using 224.72966 MB memory using 234.490212 MB memory using 241.19169300000001 MB memory using 248.46728700000003 MB memory using 256.185135 MB memory using 265.241077 MB memory using 272.950707 MB memory using 279.282393 MB memory using 287.88837800000005 MB memory using 295.887373 MB memory using 305.225944 MB memory using 308.89255099999997 MB memory using 317.53945500000003 MB →puma-worker-killer発動
追記3
find_in_batches(:batch_size => 100)の時のメモリ状況
ダウンロードできました。が、メモリ増加は改善しませんでした。
・ ・ ・ memory using 618.732024 MB memory using 619.4192240000001 MB memory using 620.1064240000001 MB memory using 620.79362 MB memory using 621.48081 MB memory using 622.1680080000001 MB memory using 622.842653 MB memory using 623.016078 MB memory using 623.900232 MB memory using 621.7092120000001 MB
回答2件
あなたの回答
tips
プレビュー