2009-04-28 2 views
5

私はurllib2/BeautifulSoupを使用して解析する、外部Webサイトからそのデータの一部を受け取るDjangoビューを持っています。Djangoのキャッシュ - 先に実行できますか?

この操作はかなり高価ですので、低レベルキャッシュAPIを使用して〜5分間キャッシュします。ただし、キャッシュされたデータの有効期限が切れた後にサイトにアクセスする各ユーザーは、新しいデータを解析するために外部サイトにアクセスする間、数秒の大幅な遅延が発生します。

新しいデータを遅延ロードして、ユーザーがそのような遅延を受けることがないようにする方法はありますか?それともやむを得ないことですか?

私は共有ホスティングサーバー上にいるので、あなたの答えに留意してください。

編集:これまでのところ助けてくれてありがとう。しかし、私は私が呼び出すpythonスクリプトでこれをどのように達成するかについてはまだ分かりません。私が行った基本的なテストは、djangoキャッシュがグローバルではないことを示しています。つまり、外部のスクリプトから呼び出すと、フレームワーク内でキャッシュデータが表示されません。提案?

もう1つのEDIT:が考えられます。これはおそらくローカルメモリキャッシュを使用しているためです。私は、memcached、DBにキャッシュを移動すれば、これは解決されると思う。

+0

私は、この文脈であなたが怠け者であることを確信していません。キャッシュは、ほとんどの場合、遅延して、つまり必要なときにのみ埋められます。私はあなたが本当に他のウェブサイトからの資料をゆっくり解析することを話していると思います。 –

答えて

8

一定の間隔で実行するスケジュールを設定したいですか?いくつかのCPU時間を犠牲にして、this simple appを使用することができます。あなたはそれを使用することができるかどう

はまた、5分ごとのためcron jobは次のとおりです。

*/5 * * * * /path/to/project/refresh_cache.py 

のWebホストがこれらを設定するさまざまな方法を提供します。 cPanelの場合は、Cron Managerを使用します。 Google App Engineの場合は、cron.yamlを使用します。これらすべての場合、set up the environmentに最初にrefresh_cache.pyが必要です。

ところで、ユーザーの要求に応答することは、レイジーキャッシュとみなされます。これはプリエンプティブキャッシュです。また、ページを再作成するのに十分長い間キャッシュすることを忘れないでください!

4

私が外部のサイトにアクセスしながら、「私はまだ私が呼び出しされるPythonスクリプトでこれを実現する方法として、よくわからないんだ。」

問題は、数秒のあなたの「大幅な遅延ことです新しいデータを解析する "はDjangoキャッシュとはまったく関係がありません。

どこにでもキャッシュすることができます。また、外部サイトを再解析するときには遅延があります。そのトリックは、ユーザーが自分のページを待っている間に外部サイトを解析しないことです。

ユーザーがページを要求する前に、の前に外部サイトを解析することがトリックです。あなたは時間通りに戻ることができないので、定期的に外部サイトを解析し、解析された結果をローカルファイルやデータベースなどに残す必要があります。

ユーザーがリクエストをしたときに、結果が取得され、解析され、実行中のすべてが表示されます。

request = HttpRequest() 
request.path = url # the url of your view 
(detail_func, foo, params) = resolve(url) 
params['gmap_key'] = settings.GMAP_KEY_STATIC 
detail = detail_func(request, **params) 
out = open(dir + "index.html", 'w') 
out.write(detail.content) 
out.close() 

が、その後のcron

0

また、あなたのビューを呼び出して、ファイルに書き込み、その後、例えばlightpdとstaticalyそれを実現するためにPythonスクリプトを使用することができます証拠はありませんが、BeautifulSoupは遅くて大量のメモリを消費しています。代わりに、lxmlモジュールを使用して調べることができます。 lxmlははるかに高速かつ効率的であると考えられ、BeautifulSoupよりもはるかに多くを行うことができます。

もちろん、解析はおそらくボトルネックではありません。外部I/Oはです。

まず、memcached!を使用してください。

以下のように、使用できる1つの戦略である:

  • あなたのキャッシュされたオブジェクトは、Aと呼ばれる、(例えばA_<timestamp>)ダイナミックキーでキャッシュに格納されます。
  • もう1つのキャッシュオブジェクトには、Aの現在のキー(A_key)が保持されます。
  • アプリは、最初の定期的なプロセスは、新しいキー
A_keyで値を変更し、 A_<timestamp>キーとし、完了時にキャッシュを埋めるだろう A_key
  • で値を取得することにより、Aための鍵になるだろう

    この方法を使用すると、5分ごとにすべてのユーザーがキャッシュの更新を待つ必要はなく、更新が行われるまで古いバージョンが取得されます。

  • 4

    Iを使用してスクリプトを呼び出す:

    関連する問題