繁体   English   中英

使用Apache Lucene索引大型文件时,如何解决内存不足错误?

[英]How do I get around an out of memory error when indexing large files using Apache Lucene?

IndexFiles.java的第195行,您将看到:

 doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8))));

该行允许用户搜索文件内容。 如果有人希望显示摘要以及匹配文件的名称(类似Google搜索结果),则需要在IndexFiles.java的第195行之后添加一些代码行,如下所示:

FileReader fr = new FileReader("/home/user1/largefile.txt");
Bufferedreader  br = new BufferedReader(fr);

StringBuilder sb = new StringBuilder();
String line;

while ( (line = br.readLine()) != null){
   sb.append(line);
}

Field contentField = new StringField("content", sb.toString(), Field.Store.YES, Field.Index.ANALYZED); 

doc.add(contentField);

但是我还没有完成,我需要使用Lucene的Highlighter类,并在SearchFiles.java的第184行之后添加代码。 更具体而言,例如:

Document doc = searcher.doc(hits[i].doc);
String text = doc.getField("content");
highlighter = new Highlighter(new QueryScorer());
String summary = highlighter.getBestFragment(analyzer, "content", text);

该代码可以完美地工作,并为我提供搜索结果的摘要。 但是,如果文件太大,则在附加到StringBuilder()时,IndexFiles.java类会吐出OutOfMemeory错误。 我该如何解决?

问题是Java堆已用尽,默认情况下,最大Java堆大小为64MB,但是您可以使用选项Xmx来增加它,即-Xmx1g,它会将最大堆大小增加到1GB,并考虑到堆不能超过RAM的大小。

如果您想了解更多,请查看以下内容:

-X命令行选项

如何确定默认的Java堆大小?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM