2017-09-01 26 views
2

我在Apache Lucene中出现OutOfMemory错误。Apache Lucene中的OutOfMemory

这里的问题是代码:

DirectoryReader oldReader = directoryReader; 
DirectoryReader newReader = DirectoryReader.openIfChanged(directoryReader); 
if ((newReader != null) & (oldReader != newReader)) { 
    directoryReader = newReader; 
} 

这里是日志:

Caused by: java.lang.OutOfMemoryError: Java Heap Space 
    at java.lang.Class.getMethodImpl(Native Method) 
    at java.lang.Class.getMethod(Class.java:917) 
    at org.apache.lucene.store.MMapDirectory$MMapIndexInput$1.run(MMapDirectory.java:244) 
    at org.apache.lucene.store.MMapDirectory$MMapIndexInput$1.run(MMapDirectory.java:241) 
    at java.security.AccessController.doPrivileged(AccessController.java:327) 
    at org.apache.lucene.store.MMapDirectory$MMapIndexInput.freeBuffer(MMapDirectory.java:241) 
    at org.apache.lucene.store.ByteBufferIndexInput.close(ByteBufferIndexInput.java:295) 
    at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:788) 
    at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:694) 
    at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:400) 
    at org.apache.lucene.index.StandardDirectoryReader.isCurrent(StandardDirectoryReader.java:349) 
    at org.apache.lucene.index.StandardDirectoryReader.doOpenNoWriter(StandardDirectoryReader.java:303) 
    at org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:266) 
    at org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:254) 
    at org.apache.lucene.index.DirectoryReader.openIfChanged(DirectoryReader.java:170) 

什么想法,有什么可以是问题?

回答

1

由于您使用MMapDirectory,你应该知道,那:

注:内存映射在你的进程等于文件被大小采用了虚拟内存地址 空间的一部分映射。 在使用本课程之前,请确保您有足够的虚拟地址 空间,例如通过使用64位JRE或32位JRE,索引 保证适合地址空间。在32位平台 也请参阅MMapDirectory(Path,LockFactory,int),如果您有 由于地址空间碎片导致mmap失败的问题。如果 得到OutOfMemoryException,建议减小块的大小 ,直到它工作。

当读取时,MMapDirectory使用内存映射IO。如果您的虚拟内存相对于您的索引 大小(例如,如果您在64位JRE上运行,或者您在32位JRE上运行,但索引大小足够小以适合其大小),则这是一个很好的选择 到 虚拟内存空间

因此,考虑调整你的块大小或选择其他的执行目录,如NIOFSDirectory或SimpleFSDirectory

+0

我想既然3.3版本的Apache Lucene的使用MMapDirectory默认情况下,它给出最佳性能与其他两个实施子类相比。我没有更改默认块大小(对于64位JVM,1 GB),所以我不确定我应该如何调整块大小? –

+0

您是否认为将ulimit更改为unlimited将防止OOM错误? –