Java Lucene索引在大约100万个文件之后卡住(nrm文件越来越大…)

Java Lucene索引在大约100万个文件之后卡住(nrm文件越来越大…),java,lucene,indexing,Java,Lucene,Indexing,有人知道为什么会这样吗?我正在对XML文件进行基本的索引+SAX解析,并将每个路径作为一个新字段添加到文档中。我开始喜欢150万个文件,它在这个文件上停留了30分钟,.nrm(规范化文件??)变得越来越大 我不知道为什么会发生这种情况,我的IndexWriter是这样的: writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED) 这不是

有人知道为什么会这样吗?我正在对XML文件进行基本的索引+SAX解析,并将每个路径作为一个新字段添加到文档中。我开始喜欢150万个文件,它在这个文件上停留了30分钟,.nrm(规范化文件??)变得越来越大

我不知道为什么会发生这种情况,我的IndexWriter是这样的:

writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED)
这不是用于大型指数的最佳方法吗?为什么它在这个文件中被冻结?我已经用超过100万个XML文件运行了多次,它总是被不同的XML文件卡住(不仅仅是这个文件,它的结构很好)

编辑:

假设我使用单独的java命令一次索引2000个文件。索引完成后,我调用indexwriter close方法,如果我想重写此索引,是否遗漏了任何内容?我应该优化索引吗?我想我记得Lucene在行动中说过,如果你暂时不写信给它,就要优化它

实际上,这种方法可以处理180万个文件,但在我尝试在2000个文件中批量添加更多文件后,这个NRM文件和另一个文件的写入容量大约为70GB!如果java Lucene索引函数只在2000批中调用,为什么JVM内存会耗尽?这看起来不像是垃圾收集问题,除非在关闭索引编写器之前我需要向Lucene代码添加一些内容

编辑2:

我有大约400万个XML文件,看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<person>
   <name>Candice Archie
   </name>
   <filmography>
      <direct>
         <movie>
            <title>Lucid (2006) (V)
            </title>
            <year>2006
            </year>
         </movie>
      </direct>
      <write>
         <movie>
            <title>Lucid (2006) (V)
            </title>
            <year>2006
            </year>
         </movie>
      </write>
      <edit>
         <movie>
            <title>Lucid (2006) (V)
            </title>
            <year>2006
            </year>
         </movie>
      </edit>
      <produce>
         <movie>
            <title>Lucid (2006) (V)
            </title>
            <year>2006
            </year>
         </movie>
      </produce>
   </filmography>
</person>
很抱歉发了这么长的帖子——谢谢你的帮助! 另外,我认为服务器不是问题所在。我一次在400万个文件上运行了该代码,即使在使用Xmx12000M Xms12000M时,它也耗尽了堆内存

这是一个强大的服务器,所以它肯定能处理这个

编辑3:


你好!谢谢,你说得对。Lucene可能不是被要求这样做的。我们实际上还打算做其他实验,但我想我是在你和其他人的帮助下解决了这个问题的。首先,我停止了对字段的规范化,这使索引的大小缩小了很多倍。此外,我还使用了mergedocs和rambuffer方法,并对它们进行了改进。索引大大改进了。我将在您的帮助下标记所回答的问题:)谢谢。

尝试批量索引。下面的代码应该给你一个方法。此外,我还建议您查看Lucene的最新版本

最有可能的情况是,您正在重载垃圾收集器(假设没有难以找到的内存泄漏),这最终会导致内存不足错误

    private static final int FETCH_SIZE = 100;
    private static final int BATCH_SIZE = 1000;

    //Scrollable results will avoid loading too many objects in memory
    ScrollableResults scroll = query.scroll(ScrollMode.FORWARD_ONLY);
    int batch = 0;
    scroll.beforeFirst();
    while (scroll.next()) {
        batch++;

        index(scroll.get(0)); //index each element

        if (batch % BATCH_SIZE == 0) {
            //flushToIndexes(); //apply changes to indexes
            //optimize();
            //clear(); //free memory since the queue is processed
        }
    }

尝试分批编制索引。下面的代码应该给你一个方法。此外,我还建议您查看Lucene的最新版本

最有可能的情况是,您正在重载垃圾收集器(假设没有难以找到的内存泄漏),这最终会导致内存不足错误

    private static final int FETCH_SIZE = 100;
    private static final int BATCH_SIZE = 1000;

    //Scrollable results will avoid loading too many objects in memory
    ScrollableResults scroll = query.scroll(ScrollMode.FORWARD_ONLY);
    int batch = 0;
    scroll.beforeFirst();
    while (scroll.next()) {
        batch++;

        index(scroll.get(0)); //index each element

        if (batch % BATCH_SIZE == 0) {
            //flushToIndexes(); //apply changes to indexes
            //optimize();
            //clear(); //free memory since the queue is processed
        }
    }

谢谢你的回复!请看我的编辑。我希望你能给我更多的帮助…再次补充!谢谢:)谢谢你的回复!请看我的编辑。我希望你能给我更多的帮助…再次补充!谢谢:)
    private static final int FETCH_SIZE = 100;
    private static final int BATCH_SIZE = 1000;

    //Scrollable results will avoid loading too many objects in memory
    ScrollableResults scroll = query.scroll(ScrollMode.FORWARD_ONLY);
    int batch = 0;
    scroll.beforeFirst();
    while (scroll.next()) {
        batch++;

        index(scroll.get(0)); //index each element

        if (batch % BATCH_SIZE == 0) {
            //flushToIndexes(); //apply changes to indexes
            //optimize();
            //clear(); //free memory since the queue is processed
        }
    }