2011-09-20 56 views
2

快速的问题,是从Lucene的包(Java)的线程安全看门词干?Lucene Porter Stemmer线程安全?

我猜答案是否定的,因为你需要设置当前字符串,调用干法进而获得当前块获得词干的单词。但也许我错过了一些东西 - 是否有线程安全的方法来阻止Lucene的单个字或字符串?

是否有经验的人知道是否要更快地实例化一个Porter Stemmer实例,然后在该stemmer实例上使用同步块并执行setCurrent("..."); stem(); get();例程,或者是为每个字符串/子程序创建新的porter stemmer实例您要处理的文件。

在这种情况下我有其各自通过一个线程池吸收许多文件1000(即1线程有一个文件)。

编辑仅供参考 - 示例使用模式:

import org.tartarus.snowball.ext.PorterStemmer; 
... 
private String stem(String word){ 
     PorterStemmer stem = new PorterStemmer(); 
     stem.setCurrent(word); 
     stem.stem(); 
     return stem.getCurrent(); 
    } 

干杯!

回答

3

望着文档,似乎PorterStemmer类是不可重入,所以如果我是你,我会建立每线程一个实例。如果词干是你的程序做的主要事情之一,它有让您的CPU内核忙碌没有别的办法,那么synchronized块似乎是一个坏主意:该程序会阻止所有的时间,等待词干完成一个文件。我也不会为每个文档创建一个线程,每个核心有一个线程的线程池可能是更明智的选择。

(无例子的代码,因为我甚至不能弄清楚从API文档的使用。RTFS找出这件事情是如何工作的?)

+1

感谢Larsmans的意见。很高兴看到你正在得出同样的结论。我同意doco,它有点不好。对于其他感兴趣的人,基本使用模式已被编辑到我的问题中。在同步问题上,线程池小于文档数(20个线程)。并不是这个应用程序唯一的东西。也许最好的方法是测试,我想保持记忆,所以它可能会更好地同步。 – NightWolf

+0

您是否检查过PorterStemmer实例有多大?我无法想象它非常大,因为它只是一个FSA加上一些'StringBuilder'机器。 –

+0

-1同步,这不是真的如何编写Java代码这些天。一次性物品价格便宜,简单的对象 - 但它听起来像是每个线程应该遍历文件,并可以反复重复使用相同的词干。 **可能的理想设计:**让你的线程或DocumentProcessor(单线程)成为一个类,stemmer实例是其中的一员。 HTH @Nowwolf –