快速提问,来自Lucene包(Java)线程安全的porter stemmer?
我猜答案是肯定的,因为您需要设置当前字符串,调用干线方法然后获取当前块以获取词干。但也许我错过了一些东西 - 是否有线程安全的方法可以从Lucene中删除单个单词或字符串?
有经验的人是否知道实例化一个Porter Stemmer实例然后在该stemmer实例上使用synchronized块并执行setCurrent("..."); stem(); get();
例程或者更快创建一个新的porter stemmer实例是否更快您要处理的每个字符串/文档。
在这种情况下,我有许多1000个文档,每个文档都被一个线程池占用(即1个线程有一个文档)。
编辑FYI - 示例使用模式:
import org.tartarus.snowball.ext.PorterStemmer;
...
private String stem(String word){
PorterStemmer stem = new PorterStemmer();
stem.setCurrent(word);
stem.stem();
return stem.getCurrent();
}
干杯!
答案 0 :(得分:3)
查看文档,似乎PorterStemmer
类不可重入,所以如果我是你,我会为每个线程构建一个实例。如果词干是你的程序所做的主要事情之一,并且它没有其他方法可以让你的CPU核心保持忙碌,那么同步块似乎是个坏主意:程序会一直阻塞,等待词干分析器完成一份文件。我也不会为每个文档创建一个单独的线程;每个核心一个线程的线程池可能是更明智的选择。
(没有示例代码,因为我甚至无法从API文档中找出用法.RTFS以了解这个东西是如何工作的......)