我正在使用 Lucene 2.4.0 和 JVM (JDK 1.6.0_07)。我不断收到OutOfMemoryError: Java heap space
,当尝试索引大型文本文件时。
示例 1:对 5 MB 文本文件建立索引会导致内存不足,最大容量为 64 MB。堆大小。所以我增加了最大值。堆大小为 512 MB。这适用于 5 MB 文本文件,但 Lucene 仍然使用 84 MB 堆空间来执行此操作。为什么这么多?
班上FreqProxTermsWriterPerField
根据 JConsole 和 Eclipse Ganymede 的 TPTP 内存分析插件,Ganymede 似乎是迄今为止最大的内存消耗者。
示例 2:对 62 MB 文本文件建立索引会导致内存不足,最大容量为 512 MB。堆大小。增加最大值将堆大小设置为 1024 MB 可以,但 Lucene 在执行此操作时使用 826 MB 的堆空间。似乎仍然使用了太多的内存来执行此操作。我确信较大的文件会导致错误,因为它看起来是相关的。
我使用的是具有 2 GB RAM 的 Windows XP SP2 平台。那么索引大文件的最佳实践是什么?这是我正在使用的代码片段:
// Index the content of a text file.
private Boolean saveTXTFile(File textFile, Document textDocument) throws MyException {
try {
Boolean isFile = textFile.isFile();
Boolean hasTextExtension = textFile.getName().endsWith(".txt");
if (isFile && hasTextExtension) {
System.out.println("File " + textFile.getCanonicalPath() + " is being indexed");
Reader textFileReader = new FileReader(textFile);
if (textDocument == null)
textDocument = new Document();
textDocument.add(new Field("content", textFileReader));
indexWriter.addDocument(textDocument); // BREAKS HERE!!!!
}
} catch (FileNotFoundException fnfe) {
System.out.println(fnfe.getMessage());
return false;
} catch (CorruptIndexException cie) {
throw new MyException("The index has become corrupt.");
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
return false;
}
return true;
}
作为评论回应Gandalf
我可以看到您将 setMergeFactor 设置为 1000
API 说
设置合并因子
公共无效setMergeFactor(int
合并因子)
确定频率
段索引合并为
添加文档()。使用较小的值,索引时使用更少的 RAM, 和
对未优化索引的搜索是
速度较快,但索引速度较慢。值越大,使用的 RAM 就越多
索引期间,并且在搜索时
未优化的索引速度较慢,
索引速度更快。因此更大的值
(> 10) 最适合批量索引
创建和较小的值 (
此方法是一种方便的方法,当您增加 mergeFactor 时它会使用 RAM
我建议将其设置为 15 左右。 (在试验和错误的基础上)补充setRAMBufferSizeMB,也调用Commit(). then 优化()进而close()Indexwriter 对象。(可能创建一个 JavaBean 并将所有这些方法放在一个方法中)在关闭索引时调用此方法。
发布您的结果,反馈=]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)