質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Q&A

1回答

2027閲覧

railsで巨大なPDFを早く生成・ダウンロードさせたいです( ;∀;) お助け下さい・・・

akikko

総合スコア32

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

0グッド

1クリップ

投稿2020/11/24 04:41

編集2020/11/24 04:45

前提・実現したいこと

人数が多い名簿のPDFを動的に作成し、ダウンロードさせたいのですが、
名簿人数が3,000名を超えると、30秒以上かかり、サーバー(heroku)がタイムアウトしてしまいます。

※クラウドファンディングのようなウェブアプリを公開しています。
企画を作成したユーザーがPDF生成ボタンを押すと、データベース上のサポーター(賛同者)の名簿PDF生成することができるアプリです。

大きなファイルを早くダウンロードさせるにはどうすればよいでしょうか?
バックグラウンド処理的なことをやればよいのでしょうか?

調べても実装のイメージが全く見えず・・・。プロの皆さまにご指示を仰ごうと思います。

当方、初心者ですが、、、実アプリでエラーがでてしまい大変困っております????
どなたか、お助け下さい( ;∀;)
どうぞよろしくお願い致します・・・。

PDF作成コントローラー

def create_pdf @supporters = Supporter.where( event_id: params[:event_id], activation: 1, agreement: 1).pluck(:name, :email, :created_at) @event = Event.find(params[:event_id]) respond_to do |format| format.html format.pdf do pdf = CreatePdf.new(@supporters,@event) send_data pdf.render, filename: 'supporters_list.pdf', type: 'application/pdf', disposition: 'inline' # 画面に表示    end end end

試したこと

PDF作成ツールはPrawnを使用しており、3000名弱ぐらいまでは問題なく動きます。
データベース読み込みを早くするために、whereに、pluckの追記を行ったところ、
エラーの限界が2500名だったところが3,000名までアップしました。

しかし、10万人規模に耐えさせたいと考えており、そこまでは大変ハードルが高い状態です。
良い方法はないものでしょうか・・・?

尚**、3000名程度ですとファイルサイズは4.5MB程度**です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2020/11/25 13:54

動的がリアルタイム性を意味しているのなら動的を諦める事もひとつの選択肢 質問の本質とは関係無いがふざけた顔文字ついてるし助けて欲しそうには見えないな
guest

回答1

0

アルゴリズムを変えなければだめでしょうね。
どのくらいが限界になるかわかりませんが一度に作るとメモリーを溢れさせて止まるかも。

一度に作るとしたら、
まずどこに時間がかかっているか調べる
prawnが掛かってるのでは、と思ってますがだったらprawnの軽い処理で書くようにする。tableは重いでしょうから平文書き出すような形で。罫線諦めるか自分で書く

でも10万は難しいでしょう。1000ページのPDFですか。。。。
イベント毎に予め作っておいて、最後のページをデマンドで作って合成して書き出す。
それだけ巨大だと合成もだめかな。
しかし
10万人のemailをPDFにして配るってのは手が回りません?

投稿2020/11/25 13:48

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akikko

2020/12/14 02:46

ご返事遅くなりまして、申し訳ありません・・・。 頂いた内容から、色々考えてみたのですが・・・大変難しいですね・・・。 tableは重いということで、変えてみましたが、本質的な部分の解決までは至れませんでした???? いつもご親切にご回答下さって本当にありがとうございます。 各ユーザーさんがご自分のイベントの名簿を自動で作れるようにしたいのです。 署名活動みたいに、名簿を作って(個人情報は守りながら)相手に提出するようなサービスです。 巨大なデータベースの編集って、なかなか難しいですよね????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問