0

こんにちは私はスタンフォードパーサーのスレッドを使用したいのですが、スレッドプールでそれを行う方法がわかりません。私はすべてのスレッドがこれを行うことを望んでいます:

LexicalizedParser.apply(Object in)

しかし、lp = new LexicalizedParser( "englishPCFG.ser.gz");をロードするため、LexicalizedParserの新しいオブジェクトを常に作成したくありません。オブジェクトごとに2秒かかります。私に何ができる?

ありがとう!

4

2 に答える 2

2

遅すぎると思いますが、スレッドセーフバージョンがあります: http://nlp.stanford.edu/software/lex-parser.shtml

于 2012-01-13T00:35:05.930 に答える
1

ThreadLocalを使用できます。これにより、スレッドごとにパーサーのインスタンスを 1 つ保持できます。したがって、作成されたパーサーのインスタンスが複数のスレッドから使​​用されることはありません。

通常、使用している CPU * コアよりも多くのインスタンスを作成するべきではありません。

私にとっては、4 ~ 5 個のインスタンスです (クアッドコアでハイパー スレッディングを無効にした場合)。


PS StanfordNLP とは関係ありません。貧弱なクラスの実装に静的フィールドが含まれていて、それらをスレッドセーフでない方法で変更することがあります。このような実装の一般的な安全な並列化アプローチは次のようになります。

  1. 計算部分を別のプロセスに移動します。
  2. (CPU*コア) 計算を伴うプロセス数を起動します。
  3. メイン/バックグラウンド プロセス間の通信にIPCテクニックを使用します。
于 2011-07-13T08:25:34.073 に答える