- 締切済み
perlの実行結果をキャッシュ
お世話になります。 perlの実行結果を一定期間キャッシュさせて、 キャッシュが存在しているなら、perlで処理させずに キャッシュを参照して表示させるようにできればと思っているのですが 何か効率の良い方法などありますでしょうか? 毎回、毎回処理をさせることなく、 一度処理したものはキャッシュさせて、 次回からはそのキャッシュを参照させて 少しでも負荷軽減になればと思っています。 ただ、ソケットを利用してWEBからデータを取得させているので、 一定期間になるとまたキャッシュを取り直す・・・ といったことをしたいのですが・・。 やっかいな事に1パターンではなく、 表示件数指定などもあり、ユーザーの設定によって 変化する部分が多いので、それごとにキャッシュをとらせる必要がありそうですが、動的に生成されるものをキャッシュさせる場合に 良い方法がありましたらご教授いただけましたら幸いです。 まだまだperl初心者枠のレベルだと思いますので できれば詳しく教えていただけましたら助かります。 宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
#2です。 >そこでファイルのオープンエラーとなって止まってしまいます。 たしかに、検索キーワードを直接ファイル名として使うのはよくありません。 サーバーのOSによっては、オープンできなくなる文字でもファイルが生成できてしまうバグは確かにあるからです。 また、全角キーワードがありえる場合、文字コードを意識する必要もあってなかなか面倒です。 これを防ぐには、ファイル名は自前で生成したユニークなものを使用することです。 俺のシステムの場合、キーワードではなく、取得元URL(デコードしていないURLからスラッシュ等のみを除いたもの)を使っていました。 また、time の値とIPの組み合わせなど、ユニークな値になるような工夫をするのも手でしょう。 これを、キャッシュリストファイルを別に作ってキーワードと1:1で対応させるなどすれば、キーワードからローカルのキャッシュファイルを引っ張ってくることができます。 なおキャッシュリストファイルは、プログラムの先頭で連想配列に格納すれば、いざ使うとき高速にアクセスできます。
自分でテンポラリファイルを開いて、最終的な実行結果を格納するしかないと思います。 俺が自作しているフリーウェアは、構造の関係でそうやってます。 (なお、実行途中の中途半端なデータをパターンごとにキャッシュするのは、泥沼にはまる可能性があるので賛成できません) すでにソケットを使ったWEBアクセスを行っているなら、HTTPプロトコルの HEAD メソッドを使って、オリジナルが更新されたかのチェックができるはずです。(ただしオリジナルがCGIの場合、返値は信用できない) その値を参考にすれば、かなり効率よくキャッシュシステムが作れると思います。 なお、上述の通り俺は Perl でキャッシュシステムを組んだことがあるので、具体的なロジックに関する質問があるなら、もしかしたら答えられるかもしれません。 その際は補足欄に書いてください。
補足
ご回答ありがとうございます。 更新されたかどうかでチェックさせるというのは 無駄がなく素晴らしいです。 なかなか上手く説明ができなくて申し訳ないのですが、 yahoo!やgoogleのような検索エンジンのような検索システムを作り、 検索結果をキャッシュさせるといった事をしたいと思っています。 http://www.google.co.jp/search?hl=ja&q=%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5+%E5%88%B6%E5%BE%A1 例えば上記のようなGoogleの検索結果をキャッシュさせて、 次回、まったく同じ検索キーワードであれば、 ソケットで読み込まずに キャッシュファイルの方を表示させるようにしたいとすると、 私が考えられるのはqの値をファイル名にしておいて 検索結果をキャッシュファイルとして保存しておき、 このファイル名と検索窓に入力されたキーとの一致をもとにして キャッシュファイルがあるかどうかを チェックして、と言う流れしか思いつきません。 ただ、これだと保存させるファイル名によっては ファイル名が開けなくなってしまうらしく、 そこでファイルのオープンエラーとなって止まってしまいます。 deagle様のおっしゃるように、 オリジナルが更新されたかをチェックした上で、 更新されている場合のみキャッシュファイルを更新させると いった仕組みで、検索窓に入力されるキー別の結果を キャッシュさせるという流れができればと思います。 わかりづらい説明で申し訳ありませんが ご教授いただけましたら幸いに思います。
参考になるものが混ざっててくれるといいけど・・・ http://www.google.co.jp/search?hl=ja&q=%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5+%E5%88%B6%E5%BE%A1+perl+-%E4%BE%A1%E6%A0%BC+-ISBN+-2ch&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
お礼
効率の良い検索方法を教えていただきましてありがとうございます。 色々勉強になるページがありました。
お礼
すいません。 ちょっとスレッドと内容がずれてきましたので 新規スレッドにて質問させていただきます。 ご教授いただきまして、ありがとうございました。
補足
何度もご教授いただきましてありがとうございます。 おっしゃるとおりの方法でやってみたいと思います。 もう1つだけご教授いただけますと幸いです。 たとえば、以下のようにリストをlist.datへ保存させて、 キーワード1<>filename1<>time1<> キーワード2<>filename2<>time2<> 通常の配列の場合は open(IN,"list.dat"); while (<IN>) { ($key,$name,$time) = split(/<>/); if($FORM{'key'} eq $key) { last; } } のようにしてフォームで入力したものとマッチさせるような 形になると思いますが、連想配列を活用すると もっと効率よく高速に処理できるのでしょうか? もしよろしければソースを教えていただけましたら幸いです。