Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Lucene索引具有20 M记录需要更多时间_Java_Linux_Performance_Indexing_Lucene - Fatal编程技术网

Java Lucene索引具有20 M记录需要更多时间

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

我有以下用于索引的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万条记录

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;
}