6

かなり複雑な Web アプリケーションを作成しています。Python バックエンドは、頻繁には変更されないいくつかの相互に関連するデータベース テーブルに格納されたデータと、頻繁に変更されるユーザー固有のデータに状態が依存するアルゴリズムを実行します。アルゴリズムのユーザーごとの状態は、ユーザーがアプリケーションを操作するにつれて、多くの小さな変化を受けます。このアルゴリズムは、特定の重要な決定を行うために、各ユーザーの作業中に頻繁に使用されます。

パフォーマンス上の理由から、(半正規化された) データベース データからのリクエストごとに状態を再初期化することは、すぐに実行不可能になります。たとえば、状態の Python オブジェクトを何らかの方法でキャッシュして、必要に応じて簡単に使用および/または更新できるようにすることが非常に望ましいでしょう。ただし、これはWebアプリケーションであるため、リクエストを処理するプロセスがいくつかあるため、グローバル変数を使用することは問題外です.

関連するオブジェクトを(ピクル経由で)シリアル化し、シリアル化されたデータをDBに保存しようとしましたが、現在、memcachedを介してシリアル化されたデータをキャッシュすることを試しています。ただし、これには、オブジェクトを頻繁にシリアル化および逆シリアル化するという大きなオーバーヘッドが依然としてあります。

私は共有メモリソリューションを見てきましたが、私が見つけた唯一の関連するものはPOSHです。しかし、POSH は広く使用されているようには見えず、そのような実験的なコンポーネントを自分のアプリケーションに統合するのは簡単ではありません。

アドバイスが必要です!これは Web アプリケーションを開発する最初の試みなので、これが十分に一般的な問題であり、そのような問題に対するよく知られた解決策があることを願っています。この時点では、Python バックエンドが単一のサーバーで実行されていることを前提とするソリューションで十分ですが、複数のサーバーに拡張するソリューションの追加ポイント:)

ノート:

  • 私はこのアプリケーションを動作させており、現在ライブでアクティブなユーザーがいます。時期尚早の最適化を行わずに開始し、必要に応じて最適化しました。上記の問題が実際のボトルネックであることを確認するために、測定とテストを行いました。現在のセットアップからより多くのパフォーマンスを引き出すことができると確信していますが、より良い方法があるかどうかを尋ねたかった.
  • セットアップ自体はまだ進行中です。システムのアーキテクチャは、ソリューションに適したものであれば何でもよいと想定してください。
4

6 に答える 6

8

時期尚早の最適化に注意してください。

追加: 「Python バックエンドは、その状態のアルゴリズムを実行します...」は、Web フレームワークのセッションです。それでおしまい。Django フレームワークがキャッシュ内のセッション状態を維持できるようにします。限目。

「アルゴリズムのユーザーごとの状態は、ユーザーがアプリケーションを操作するにつれて多くの小さな変化を受けます。」ほとんどの Web フレームワークは、キャッシュされたセッション オブジェクトを提供します。多くの場合、非常に高性能です。これについては、 Django のセッション ドキュメントを参照してください。

アドバイス。[改訂]

あなたはうまくいくものを持っているようです。フレームワークを学び、ツールを学び、汗をかくことなく回すことができるノブを学ぶために活用してください。具体的には、セッション状態を使用します。

次に、キャッシング、セッション管理、および簡単に調整できるものをいじって、十分な速度があるかどうかを確認します。それらを試して、MySQL ソケットまたは名前付きパイプのどちらが速いかを調べてください。これらはプログラミング不要の最適化です。

3 番目に、パフォーマンスを測定して実際のボトルネックを見つけます。代替案の有意義な比較を提供するのに十分な有用性と安定性を備えた、十分にきめの細かい測定値を提供する (そして防御する) 準備をしてください。

たとえば、永続セッションとキャッシュされたセッションのパフォーマンスの違いを示します。

于 2008-12-01T11:29:48.337 に答える
4

マルチプロセッシングフレームワークには、ここで適用できるものがあると思います。つまり、共有 ctypes モジュールです。

マルチプロセッシングは Python にとってかなり新しいものであるため、奇妙な点がいくつかあるかもしれません。を介して生成されていないプロセスでソリューションが機能するかどうかはよくわかりませんmultiprocessing

于 2008-12-01T11:32:43.523 に答える
2

まず第一に、あなたのアプローチは一般的なWeb開発の慣習ではありません。マルチスレッドが使用されている場合でも、Webアプリケーションは、スケーラビリティと展開の容易さの両方のために、マルチプロセッシング環境を実行できるように設計されています。

大きなオブジェクトを初期化するだけで、後で変更する必要がない場合は、WSGIアプリケーションの作成中に初期化されるグローバル変数を使用するか、モジュールにオブジェクトがロードされているなどの方法で簡単に変更できます。マルチプロセッシングはあなたのためにうまくいくでしょう。

オブジェクトを変更してすべてのスレッドからアクセスする必要がある場合は、オブジェクトがスレッドセーフであることを確認する必要があります。ロックを使用してそれを確認してください。そして、単一のサーバーコンテキストであるプロセスを使用します。マルチスレッドのPythonサーバーならどれでもうまく機能します。また、FCGIはこの種の設計に適しています。

ただし、複数のスレッドがオブジェクトにアクセスして変更している場合、ロックはパフォーマンスの向上に非常に悪い影響を与える可能性があり、すべての利点が失われる可能性があります。

于 2008-12-01T13:47:51.537 に答える
2

これは、Python プログラミング言語で記述されたアプリケーション用の永続オブジェクト システムである Durus です。Durus は、1 つ以上のプロセスで使用されるオブジェクト インスタンスの一貫したコレクションを使用および維持する簡単な方法を提供します。永続インスタンスへのアクセスと変更は、 commit() メソッドと abort() メソッドを含むキャッシュされた Connection インスタンスを介して管理されるため、変更はトランザクションに対応します。

http://www.mems-exchange.org/software/durus/

以前、特定の計算の結果を保持したい研究コードで使用したことがあります。私のニーズをよりよく満たすので、最終的にpytablesに切り替えました。

于 2009-05-17T02:31:06.547 に答える
2

ZODBを試してみるとよいと思います。

「ZODB の主要な機能は透過性です。データベースとの間でオブジェクトを明示的に読み書きするためのコードを記述する必要はありません。永続オブジェクトを、Python 辞書のように機能するコンテナーに入れるだけです。この内部のすべてディクショナリはデータベースに保存されます。このディクショナリはデータベースの「ルート」と呼ばれます。これは魔法の袋のようなものです。その中に入れた Python オブジェクトはすべて永続化されます。"

最初は Zope の不可欠な部分でしたが、最近ではスタンドアロンのパッケージも利用可能になりました。

次の制限があります。

「実際には、ZODB に保存できるものにはいくつかの制限があります。「pickle」できるオブジェクトは、標準のクロスプラットフォームのシリアル形式に保存できます。リスト、辞書、数字などのオブジェクトは pickle できます。オブジェクトファイル、ソケット、Python コード オブジェクトなどは、ピクルできないため、データベースに格納できません。」

私はそれを読みましたが、自分で試したことはありません。

他に考えられるのは、メモリ内のsqlite dbである可能性があります。これにより、プロセスが少し高速化される可能性があります-メモリ内のdbですが、それでもシリアライゼーションなどすべてを行う必要があります。注: インメモリ db はリソースを多く消費します。

ここにリンクがあります: http://www.zope.org/Documentation/Articles/ZODB1

于 2008-12-01T11:07:00.190 に答える
1

別のオプションは、状態の要件を確認することです。シリアライゼーションがボトルネックである場合、オブジェクトは非常に大きくなります。そんなに大きなオブジェクトが本当に必要ですか?

Stackoverflow ポッドキャスト 27 で、reddit の人たちが状態に何を使用するかについて話し合っていることを知っています。

于 2008-12-01T11:30:39.003 に答える