3

私は、メイン アプリ API に自然言語処理サポートを提供する Python ベースの Web サービスを構築しています。NLP が非常に重いため、何らかの分析を行う前に、いくつかの非常に大きな (50 ~ 300MB) コーパス ファイルをディスクから unpickle する必要があります。

これらのファイルをメモリにロードして、すべてのリクエストで使用できるようにするにはどうすればよいですか? memcached と redis を試してみましたが、それらははるかに小さなオブジェクト用に設計されているようです。Flask オブジェクトも使用しようとしましたgが、これは 1 回のリクエストでしか持続しません。

gevent (または他の) サーバーを使用して同時接続を許可するときにこれを行う方法はありますか? コーパスは完全に読み取り専用であるため、メモリを複数のグリーンレット/スレッド/プロセスに公開する安全な方法が必要です。

ばかげた質問でしたら、どうもありがとうございました。私はかなり長い間 Python を使用してきましたが、Web プログラミングは比較的新しいものです。

4

2 に答える 2

1

Gevent を使用している場合、読み取り専用のデータ構造をプロセスのグローバル スコープに含めることができ、それらはすべての greenlet によって共有されます。Gevent を使用すると、サーバーは単一のプロセスに含まれるため、データを一度ロードして、すべてのワーカー greenlet 間で共有できます。

データへのアクセスをカプセル化する良い方法は、アクセス関数またはクラスをモジュールに入れることです。モジュールがインポートされたときにデータの unpicliking を実行するか、誰かが関数をモジュールに初めて呼び出したときにこのタスクをトリガーすることができます。

競合状態が発生する可能性がないことを確認する必要がありますが、データが厳密に読み取り専用であれば問題ありません。

于 2013-08-17T02:46:37.837 に答える