2012-03-28 14 views
9

私はRails 3.2からストリーミングダウンロード(CSV)を行っています。最初のページリクエストの問題に対して、長い時間がかかります。次のコントローラのコードは私の問題を示しています。以上によりRails 3.2 streaming

 self.response_body = Enumerator.new do |y| 
     10_000_000.times do 
      y << "Hello World" 
     end 
     end 

を、応答が(...ユニコーン、私の場合はそれをサポートすることができますよりも、サーバーから)そのストリーミングのように見えるん。それは、ストリーミングが始まる前に、私が望む時間よりもはるかに長い時間です。私は次のように変更した場合、それははるかに高速に起動します:

 self.response_body = Enumerator.new do |y| 
     1000.times do 
      y << "Hello World" 
     end 
     end 

私の理解では、応答は、ループの最初の繰り返しで始めなければならないことですが、大きなループが初期ロード時間を長くすることを引き起こしているようです。各反復が起こったときに出力される場合、ストリーミングプロセスを開始するのにかかる時間は同じではありません。

ありがとうございました。

編集:

ここでは、私が試みている技術について説明します。たぶん私はステップを誤解または行方不明です?: http://facebook.stackoverflow.com/questions/3507594/ruby-on-rails-3-streaming-data-through-rails-to-client/4320399#4320399

EDIT:

を私はラックキャッシュが私の問題を引き起こしている可能性があります...私は、個々の要求のためにそれをオフにすることができると思い

EDIT解か:

私は、ラックのキャッシュについて間違っていました。私はちょうど私の応答にself.response.headers['Last-Modified'] = Time.now.ctime.to_sを追加する必要がありました。

+1

、私はそれを得ることはありません。このコードは、別の列挙子から1つの列挙子を作成し、response_body変数を割り当てます。右にあるものは最初に実行されます(あなたが魔法のメタ情報を持っていない限り)。あなたが入れた番号が大きいほど時間がかかります。あなたはストリーミングをするために何かもっと必要ですが、私は自分で提案しません。 – froderik

+0

あなたは既にhttp://api.rubyonrails.org/classes/ActionController/Streaming.htmlをチェックアウト済みでしょう。 – froderik

+0

上記のテクニックの説明については、上記のリンクを参照してください。 –

答えて

10

編集した質問には、私が必要としていた答えが含まれていました。ここに回答として投稿する

ラックハンドラが適切にストリーミングするために取得への答えは、レスポンスにLast-Modifiedヘッダを追加することは明らかである:

self.response.headers['Last-Modified'] = Time.now.ctime.to_s 
+0

こんにちは、私はあなたが言ったのと同じ手順を実行しますが、データはストリーミングされません。シンサーバーを使用していますが、どうすればストリーミングを有効にできますか? –

+0

おそらく、代わりにTime.now.httpdateを使用したいと思うでしょう。 – dkubb