Java Lucene索引具有20 M记录需要更多时间
我有以下用于索引的Lucene代码,当我使用100万条记录运行此代码时,它运行得很快(15秒钟内索引(本地和服务器配置都很高)) 当我尝试索引2000万条记录时,完成索引大约需要10分钟 我在Linux服务器上运行这2000万条记录,内存超过100GB。在这种情况下,设置更多的RAM缓冲区大小是否有帮助?如果是,在我的情况下可以设置多少RAM大小(我喜欢超过100 GB的RAM) 我在本地机器(8GB RAM)中尝试了相同的2000万条记录,它花费了相同的10分钟,我在本地机器中尝试了将1GB RAM缓冲区大小设置为相同的10分钟,但没有设置任何RAM缓冲区,在本地机器中为2000万条记录设置了相同的10分钟 我尝试在linux中不设置RAM缓冲区大小,大约需要8分钟来处理2000万条记录Java Lucene索引具有20 M记录需要更多时间,java,linux,performance,indexing,lucene,Java,Linux,Performance,Indexing,Lucene,我有以下用于索引的Lucene代码,当我使用100万条记录运行此代码时,它运行得很快(15秒钟内索引(本地和服务器配置都很高)) 当我尝试索引2000万条记录时,完成索引大约需要10分钟 我在Linux服务器上运行这2000万条记录,内存超过100GB。在这种情况下,设置更多的RAM缓冲区大小是否有帮助?如果是,在我的情况下可以设置多少RAM大小(我喜欢超过100 GB的RAM) 我在本地机器(8GB RAM)中尝试了相同的2000万条记录,它花费了相同的10分钟,我在本地机器中尝试了将1GB
final File docDir = new File(docsPath.getFile().getAbsolutePath());
LOG.info("Indexing to directory '" + indexPath + "'...");
Directory dir = FSDirectory.open(new File(indexPath.getFile().getAbsolutePath()));
Analyzer analyzer = null;
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_47, analyzer);
iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
iwc.setRAMBufferSizeMB(512.0);
IndexWriter indexWriter = new IndexWriter(dir, iwc);
if (docDir.canRead()) {
if (docDir.isDirectory()) {
String[] files = docDir.list();
if (files != null) {
for (int i = 0; i < files.length; i++) {
File file = new File(docDir, files[i]);
String filePath = file.getPath();
String delimiter = BatchUtil.getProperty("file.delimiter");
if (filePath.indexOf("ecid") != -1) {
indexEcidFile(indexWriter, file, delimiter);
} else if (filePath.indexOf("entity") != -1) {
indexEntityFile(indexWriter, file, delimiter);
}
}
}
}
}
indexWriter.forceMerge(2);
indexWriter.close();
有什么想法吗?这种情况会发生,因为您试图在一次提交中索引所有2000万个文档(Lucene需要在内存中保存所有2000万个文档)。应该做些什么来修复它-就是添加
writer.commit()
在indexEntityFile方法中,每X添加一个文档。X可能是100万左右
代码可能如下所示(仅显示方法,您需要根据需要修改此代码)
谢谢@Misterion。。实际上,我正在处理大约3.6亿条记录(两个不同的文件),目前大约需要40分钟。。当我在10米记录中提交一次时,我节省了5分钟。。。谢谢你。。但是,当我尝试每5米提交一次记录时,又需要40分钟来处理。提交太多是否也会减慢处理速度?无论如何,我将尝试每20米提交一次记录,明天我会让您知道结果。您可以每1米尝试一次,使用1米创建索引需要相同的时间(40分钟),但搜索速度非常慢。我觉得频繁提交不会有帮助。索引后,您可以优化索引以将其合并到一个段中,这将加快搜索速度
writer.commit()
int numberOfDocsInBatch = 0;
...
writer.addDocument(doc);
numberOfDocsInBatch ++;
if (numberOfDocsInBatch == 1_000_000) {
writer.commit();
numberOfDocsInBatch = 0;
}