1

静的データ構造を正常に構築した後 (こちらを参照)、ユーザーが操作を要求するたびに最初から構築する必要はありません。私の単純な最初のアイデアは、(python の pickle を使用して) 構造をファイルにダンプし、クエリごとにこのファイルをロードすることでした。言うまでもなく (私が理解したように)、ファイルがかなり大きいため、これには時間がかかりすぎます。

このことを簡単にスピードアップする方法はありますか? ファイルを複数のファイルに分割しますか? または、サーバー上で実行されているプログラムですか? (これを実装するのはどれくらい難しいですか?)

ご協力いただきありがとうございます!

4

4 に答える 4

4

メモリ キャッシュ ( memcachedなど) にダンプできます。

この方法には、キャッシュ キーの無効化という利点があります。基になるデータが変更されると、キャッシュされたデータを無効にすることができます。

編集

memcached の python 実装は次のとおりです: python-memcached。ありがとうNicDumZ

于 2009-06-07T14:46:53.690 に答える
3

Unladen Swallowプロジェクトで提供されているパッチを使用して Python ランタイムを再構築できる場合、ベンチマークによると、pickling で 40% から 150%、unpickling で 36% から 56% のスピードアップが見られるはずです。たぶんそれが役立つかもしれません。

于 2009-06-07T15:02:05.797 に答える
2

Webアプリケーションを高速化するための一番の方法は、特に初期化する必要のあるほとんど静的なモジュール、クラス、オブジェクトがたくさんある場合です。mod_wsgiなどの単一のインタープリターからの複数のリクエストの処理をサポートするファイルを処理する方法を使用します。 、mod_python、SCGI、FastCGI、Google App Engine、Pythonウェブサーバー...基本的に、リクエストごとに新しいPythonプロセスを開始する標準のCGIスクリプトを除くすべて。このアプローチを使用すると、データ構造をグローバルオブジェクトにすることができます。このオブジェクトは、新しいプロセスごとにシリアル化された形式から読み取るだけで済みます。これは、それほど頻繁ではありません。

于 2009-06-07T18:40:06.657 に答える
2

私の提案は、オブジェクト構造を持つことに依存しないことです。代わりに、ランダムアクセス操作を実行し、その構造内のポインターを使用して相互参照を実装できるバイト配列 (または mmap'd ファイルなど) を用意します。

確かに、コードへのポインターの概念が導入されますが、ハンドラー プロセスが起動するたびに unpickle する必要がなくなり、使用するメモリも大幅に少なくなります ( python オブジェクトのオーバーヘッド)。

データベースはハンドラープロセスの存続期間中に修正されるため(私は想像しています)、同時変更やロックなどについて心配する必要はありません.

提案したことを行ったとしても、ユーザーの要求ごとに再構築する必要はありません。インスタンスをワーカー プロセスのメモリに保持するだけです。つまり、構築するだけなので、構築に時間がかかりません。それは、新しいワーカー プロセスが開始されたときです。

于 2009-06-07T14:45:46.173 に答える