在文档导入方法中,我处理大量文件。每个文件的大小也可以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:锁定获取超时:NativeFSLock @ C:\ lucene \ index \ write.lock”
例如,有时在100个文件中索引了30个文件。其他由于错误而未编入索引。
如何解决此错误?我该如何处理?
最佳答案
当索引上已经有一个写程序打开时,当您尝试打开IndexWriter
时收到此错误。
除了这个问题,打开一个新的IndexWriter
是非常昂贵的操作。即使您要使其正常工作(例如同步打开,使用然后关闭IndexWriter
的块),这也可能很慢。
而是打开一个IndexWriter
,使其保持打开状态,并在每个线程中共享它。