0

hello I want to use stanford parser wuth threads but I dont know how to do that with thread pool. I want that all threads will do this:

LexicalizedParser.apply(Object in)

but I dont want to create all the time new object of LexicalizedParser because it will load lp = new LexicalizedParser("englishPCFG.ser.gz"); and it will take 2 sec for each obj. what can I do?

thanks!

4

2 回答 2

2

我猜为时已晚,但有一个线程安全版本:http: //nlp.stanford.edu/software/lex-parser.shtml

于 2012-01-13T00:35:05.930 回答
1

您可以使用ThreadLocal。它允许您为每个线程保留一个解析器实例。因此,任何创建的解析器实例都不会被多个线程使用。

通常它不应该创建比你拥有的 CPUs*cores 更多的实例。

对我来说,大约是 4-5 个实例(如果我在我的四核上禁用超线程)。


PS与 StanfordNLP 无关。有时糟糕的类实现包含静态字段并以非线程安全的方式修改它们。这种实现的一般安全并行化方法是:

  1. 将计算部分移动到单独的进程中
  2. 启动 (CPUs*cores) 计算的进程数。
  3. 使用IPC技术在主/后台进程之间进行通信。
于 2011-07-13T08:25:34.073 回答