lucene ファイルのインデックス作成のパフォーマンスを向上させようとしています。このために、ジョブを実行するワーカー「LuceneWorker」を作成しました。
以下のコードでは、「同時」実行が大幅に遅くなります。私はその理由を知っていると思います.LuceneWorkerのさらに別のタスクを実行するためのメモリがほとんどないのは、先物が限界に達したためです.
Q: エグゼキューターに入る「ワーカー」の量を制限する方法はありますか? 言い換えれば、「n」個の先物がある場合 - 続行せず、最初にドキュメントのインデックス作成を許可しますか?
私の直感的なアプローチは、ArrayBlockingQueue を使用してコンシューマー/プロデューサーを構築することです。しかし、私はそれを再設計する前に正しいのだろうか.
ExecutorService executor = Executors.newFixedThreadPool(cores);
List<Future<List<Document>>> futures = new ArrayList<Future<List<Document>>>(3);
for (File file : files)
{
if (isFileIndexingOK(file))
{
System.out.println(file.getName());
Future<List<Document>> future = executor.submit(new LuceneWorker(file, indexSearcher));
futures.add(future);
}
else
{
System.out.println("NOT A VALID FILE FOR INDEXING: "+file.getName());
continue;
}
}
int index=0;
for (Future<List<Document>> future : futures)
{
try{
List<Document> docs = future.get();
for(Document doc : docs)
writer.addDocument(doc);
}catch(Exception exp)
{
//exp code comes here.
}
}