2016-09-16 1 views
0

私は約30,000件の注文(レコード)を持っています。 コントローラからは、バックグラウンド処理のために遅延ジョブを使用して注文(レコード)のCSVを含む電子メールを送信します。コードは次のようである -巨大なCSVファイルをメールに添付して送信すると、私は非常に遅い応答を得ており、時にはタイムアウトが要求されます。

OrderNotifier.delay.send_orders_csv(current_user, arranged_orders) 

メーラで -

def send_orders_csv(logged_in_user, orders) 
    @user = logged_in_user 
    attachments['orders.csv'] = { mime_type: 'text/csv', content: Order.orders_csv(logged_in_user, orders) } 
    mail(to: logged_in_user.email, subject: 'Orders CSV') 
    end 

そして、それは遅延に行を挿入::仕事はほとんど3万私のように送信する必要があるレコードのがあるので、それは多くの時間がかかりますCSV添付。 私はdelayed_job労働者を増やしてみました。しかし、それはそれを解決しませんでした。

大量のレコードを含むメールをCSVファイルに一度に送信するにはどうすればよいですか?

答えて

1

は、おそらくより良いCSVファイルをZIPまたは

+0

多量のデータを持つ可変注文があり、ジョブがDelayed :: Jobに挿入されると実際にその変数が保存されます。そして、それがリクエストタイムアウトの背後にある理由です。 –

0

をファイルへのリンクを送信するために、私は、これに対する解決策を見つけました。 私は遅延ジョブを使用していると私はメーラーのメソッドに巨大なデータを渡していたと遅延ジョブがオブジェクトのメタデータを格納していたことを意味します。そして、周りの30Kレコードのメタデータを格納し、だから私はCSV I、E「orders_csv」使用find_in_batchesを生成しているメソッド内

def send_orders_csv(logged_in_user, orders_params) 
    orders = Order.fetch(orders_params) 
    @user = logged_in_user 
    attachments['orders.csv'] = { mime_type: 'text/csv', content: Order.orders_csv(logged_in_user, orders) } 
    mail(to: logged_in_user.email, subject: 'Orders CSV') 
end 
  • そしてもう一つとして、メーラーのメソッドにフィルタのparamater年代を通過したため(http://api.rubyonrails.org/classes/ActiveRecord/Batches.html )は、オブジェクト全体を保持しませんが、バッチでオブジェクトを保持し、オブジェクトの1つのバッチで完了したらメモリを解放します。

これもスペースと時間の複雑さを低減しました。

関連する問題