2017-09-01 14 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) 

問題になる可能性がどのような任意のアイデア、?あなたがMMapDirectoryを使用しているので、あなたは注意する必要があります

答えて

1

、その:

メモ:メモリマッピングは、ファイルの存在の大きさに等しいあなたのプロセスでの仮想メモリアドレス スペースの一部を使用していますマップされます。 このクラスを使用する前に、仮想アドレス のスペースが十分にあることを確認してください。 64ビットのJRE、または がアドレス空間内に収まることが保証されているインデックスを持つ32ビットのJREを使用します。 32ビットプラットフォームの場合、アドレス空間が断片化しているためmmapに問題がある場合は、 のMMapDirectory(Path、LockFactory、int)も参照してください。 OutOfMemoryExceptionを取得した場合は、チャンク のサイズを小さくすることを推奨します。

MMapDirectoryは、読み込み時にメモリマップされたIOを使用します。たとえば、64ビットJREで実行している場合、または 32ビットJREで実行しているが、インデックスサイズが十分小さい場合など、インデックスのサイズに対して仮想メモリが十分にある場合は、これは良い です。 仮想メモリ空​​間に

ので、バージョン3.3はApache Luceneには、最高のパフォーマンスを与える、デフォルトでMMapDirectoryを使用しているためNIOFSDirectoryまたはSimpleFSDirectory

+0

ように私は思う、あなたのチャンクサイズを調整するか、ディレクトリの他の実装を選択考慮する他の2つの実装サブクラスと比較して私はデフォルトのチャンクサイズ(64ビットJVMの場合は1 GB)を変更していないので、チャンクサイズを調整するにはどうすればよいか分かりません。 –

+0

ulimitを無制限に変更すると、OOMエラーが防止されると思いますか? –

関連する問題