1

WebサービスでStanfordParserを使用する必要があります。SentenceParserが大きなオブジェクトをロードするときに、それがシングルトンであることを確認しますが、この場合、スレッドセーフですか(http://nlp.stanford.edu/software/parser-faq.shtmlによるとありません)。他にどのように効率的に行われるでしょうか?1つのオプションは、使用中にオブジェクトをロックすることです。

スタンフォードの人々がhttp://nlp.stanford.edu:8080/parser/のためにこれをどのように行っているかについて何か考えはありますか?

4

2 に答える 2

2

競合が要因でない場合は、ロック(同期)が1つのオプションであり、それで十分な場合があります。

ただし、競合がある場合は、3つの一般的なオプションが表示されます。

(1)毎回インスタンス化する

解析を実行するたびに、ローカル変数としてインスタンス化するだけです。ローカル変数は自明に安全です。もちろん、インスタンス化は無料ではありませんが、特定の状況によっては許容できる場合があります。

(2)threadlocalsを使用する

インスタンス化にコストがかかることが判明した場合は、threadlocalsの使用を検討してください。各スレッドはパーサーの独自のコピーを保持し、パーサーインスタンスは特定のスレッドで再利用されます。ただし、スレッドローカルには問題がないわけではありません。スレッドローカルは、nullに設定されていない場合、または保持しているスレッドがなくなるまで、ガベージコレクションされない場合があります。したがって、それらが多すぎると、メモリの問題が発生します。次に、再利用に注意してください。これらのパーサーがステートフルである場合は、スレッドローカルインスタンスを後で使用しても、以前の使用による副作用が発生しないように、初期状態をクリーンアップして復元する必要があります。

(3)プーリング

通常、プーリングは推奨されなくなりましたが、オブジェクトサイズが非常に大きく、許可できるインスタンスの数を厳しく制限する必要がある場合は、オブジェクトプールを使用するのが最適なオプションです。

于 2010-12-01T17:51:44.810 に答える
0

スタンフォードの人々がどのようにサービスを実装したかはわかりませんが、http://www.rabbitmq.com/などのメッセージ フレームワークに基づいてそのようなサービスを構築します。したがって、フロント エンド サービスはドキュメントを受信し、メッセージ キューを使用して、NLP 解析を実行する複数のワーカーと通信 (ドキュメントの保存と結果の取得) を行います。ワーカーは、処理を終了した後、フロント エンド サービスによって消費されるキューに結果を格納します。このアーキテクチャにより、負荷が高い場合に新しいワーカーを動的に追加できます。特に、NLP のタグ付けには時間がかかります。ドキュメントごとに数秒かかります。

于 2010-12-01T15:26:45.227 に答える