大津さん お返事ありがとうございます。
> この「中略」の部分ですが、元のサンプルと同じくファイルストリームの生成し > て open 後の response に pipe で渡しているのでしょうか? そうです。 この中略部分以降はcache[f]が存在する場合には実行しないので、とりあえず 最初のリクエストにはストリームでファイルコンテンツを渡しつつ、fs.statあたりでキャッシュ生成を行うような動作です。 厳密には中略部より先にcache[f]をとりあえず作っておいたほうがよいのかもしれません。 > 最初のリクエストの回線がファイル読み込み速度に対して遅く res.write() が > false を頻繁に返す状況だと、いつまでたってもキャッシュ生成が終わらず2つ > 目以降のリクエストがずーっと待たされることになると思います。 これもその通りです。 ローカルのテストでも無駄に大きいファイルに複数アクセスをかけると、ブラウザの2つ目のアクセス以降はタイムアウトになります。 (Chromeでテストする際、アドレスバーに入力するとタイミングによってはそのURLに一度アクセスするので、サーバ側でいきなり勝手にキャッシング動作を始めていて、1つ目のアクセスからタイムアウトになるケースも…) いずれにしても、いただいたコンセプトをなんとか動かしてみた、という程度で他の色々な件はスルーした次第で、誤解を生んだようでしたらすみません。 (Stream2はまだよくみていないのですみません。) -- [email protected] (pc/mobile) mobile 090-1736-8716 @yuichirowada on twitter 2013/4/18 Shigeki Ohtsu <[email protected]> > 大津です。 > > (2013/04/18 13:33), yuichiro wada wrote: > > いただいたコードをちょっといじって動かしてみました。そこそこのサイズだと > > すぐにキャッシュが終わってしまい、とても大きいファイルでテストすると、メ > > モリの制限?でいろいろとギクシャクするので、手動ではなかなかうまく想定シ > > ナリオをテストできませんが、動いているようには見えます。 > > > > if (cache[f]) { > > cache[f].getContent(function(err, buf) { > > response.writeHead(200, headers); > > response.end(buf); > > }); > > return; > > } > > > > // 中略 > > この「中略」の部分ですが、元のサンプルと同じくファイルストリームの生成し > て open 後の response に pipe で渡しているのでしょうか? > > もしそうだとすると koichik さんからの最初の課題の問題は残ったままです > が、それに追加してキャッシュ生成の時間が最初のリクエストに依存する問題も > 出てきます。(ここでは koichik さんの指示通り stream1 を前提としてます。) > > 最初のリクエストの回線がファイル読み込み速度に対して遅く res.write() が > false を頻繁に返す状況だと、いつまでたってもキャッシュ生成が終わらず2つ > 目以降のリクエストがずーっと待たされることになると思います。 > > 最初のリクエストへの書き込みもコールバックで一気に処理するよう変えればい > いですが、それですと最初のリクエストでもファイル読み込みが全部完了し、 > キャッシュ生成完了を待ってから全部コンテンツを書き込む形になります。 > > まぁ仕方ないといえばそうですけど、これ以上はまた stream2 の話になっちゃ > うのでこの辺でやめておきますね。 > > -- > > --- > このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。 > このグループから退会し、メールの受信を停止するには、[email protected]にメールを送信します。 > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。 > > > -- --- このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。 このグループから退会し、メールの受信を停止するには、[email protected] にメールを送信します。 その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
