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