执行器服务中的执行器服务?

时间:2014-05-05 22:45:14

标签: java multithreading lucene indexing executorservice

在文档导入方法中,我处理大量文件。每个文件大小也可以100mb-200mb。我想异步使用线程。在for循环中,处理每个文件然后编制索引(lucene)。这种操作实时非常耗费成本和时间。总操作不能停止。

导入方法的一般结构如下:

public void docImport()
{
  ExecutorService executor = Executors.newFixedThreadPool(5);
  for(final File file : fileList)
  {
    //Do some works...
    executor.execute(new Runnable() {
        @Override
        public void run() {
           zipFile(file); //Each zipped file has diff name and same directory.
           indexFile(file); //Each file is indexed same directory.
        }
    });
  }
  executor.shutdown();
}

indexFile方法的一般结构:

public void indexFile()
{
  ExecutorService executor = Executors.newFixedThreadPool(1);
  IndexWriter writer = null;
  Directory dir = .....;
  Analyzer analyzer = new StandardAnalyzer(LUCENE_VERSION);
  IndexWriterConfig iwc = new IndexWriterConfig(LUCENE_VERSION, analyzer);
  iwc.setRAMBufferSizeMB(200);   
  iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
  writer = new IndexWriter(dir, iwc);
  Document lucenedoc = new Document();
  lucenedoc.add(..);

  if (writer.getConfig().getOpenMode() == IndexWriterConfig.OpenMode.CREATE) {
    writer.addDocument(lucenedoc);
  } else {
    writer.updateDocument(new Term(PATH, innerPath), lucenedoc);
  }
  executor.shutdown();
} 

我的问题是:

当docImport方法工作时,5个线程读取文件,每个线程都试图将文件索引到相同的lucene索引文件。 所以错误发生在一些时间间隔:“org.apache.lucene.store.LockObtainFailedException:Lock获取超时:NativeFSLock @ C:\ lucene \ index \ write.lock”

例如,有时30个文件被索引到100个文件中。其他因错误而未编入索引。

如何解决此错误?我怎么处理这个?

1 个答案:

答案 0 :(得分:1)

当您在索引上打开作者时尝试打开IndexWriter时出现此错误。

除了该问题之外,打开新的IndexWriter非常昂贵的操作。即使你让它工作(比如同步一个打开,使用然后关闭IndexWriter的块),这可能会非常慢。

相反,打开一个IndexWriter,保持打开状态,并在每个线程中共享它。