Java Lucene Porter Stemmer线程安全?
快速提问,Lucene软件包(Java)中的porter词干分析器是线程安全的吗 我猜答案是否定的,因为您需要设置当前字符串,调用stem方法,然后获取当前块以获取词干单词。但也许我遗漏了什么——是否有线程安全的方法可以从Lucene中提取单个单词或字符串的词干 有经验的人知道实例化一个Porter词干分析器实例,然后在该词干分析器实例上使用同步块并执行Java Lucene Porter Stemmer线程安全?,java,multithreading,lucene,solr,nlp,Java,Multithreading,Lucene,Solr,Nlp,快速提问,Lucene软件包(Java)中的porter词干分析器是线程安全的吗 我猜答案是否定的,因为您需要设置当前字符串,调用stem方法,然后获取当前块以获取词干单词。但也许我遗漏了什么——是否有线程安全的方法可以从Lucene中提取单个单词或字符串的词干 有经验的人知道实例化一个Porter词干分析器实例,然后在该词干分析器实例上使用同步块并执行setCurrent(“…”)是否更快;茎();get()例程,还是为要处理的每个字符串/文档创建一个新的波特词干分析器实例更快 在本例中,我有
setCurrent(“…”)是否更快;茎();get()代码>例程,还是为要处理的每个字符串/文档创建一个新的波特词干分析器实例更快
在本例中,我有1000多个文档,每个文档都被一个线程池占用(即,一个线程有一个文档)
编辑供参考-示例使用模式:
import org.tartarus.snowball.ext.PorterStemmer;
...
private String stem(String word){
PorterStemmer stem = new PorterStemmer();
stem.setCurrent(word);
stem.stem();
return stem.getCurrent();
}
干杯 看看文档,类似乎不是可重入的,所以如果我是你,我会为每个线程构建一个实例。如果词干分析是您的程序所做的主要事情之一,并且没有其他方法让您的CPU内核保持忙碌,那么同步块似乎是个坏主意:程序将一直阻塞,等待词干分析完成一个文档。我也不会为每个文档创建一个线程;每个核心有一个线程的线程池可能是更明智的选择
(没有示例代码,因为我甚至无法从API docs.RTFS中找出它的用法来了解它是如何工作的…感谢Larsmans的评论。很高兴看到你也得出了同样的结论。我同意文件,有点糟糕。对于其他感兴趣的人来说,基本使用模式已经编辑到我的问题中。在同步问题上,线程池小于文档数(20个线程)。而词干分析并不是该应用程序唯一的功能。也许最好的确定方法是测试,我想降低内存,因此同步它可能会更好。您是否检查过一个PorterStemmer
实例有多大?我无法想象它有多大,因为它只是一个FSA加上一些StringBuilder
机器。-1在同步方面,这并不是现在编写Java代码的方式。对于简单的对象来说,一次性对象是便宜的——但听起来每个线程都应该在文档上循环,并且可以重复使用同一个词干分析器。可能的理想设计:使线程或DocumentProcessor(单线程)成为类,stemmer实例成为该类的成员。HTH@nightolf