변경된 문서를 업데이트하고 변경되지 않은 다른 문서를 그대로 유지하는 점진적 모드에서 Lucene 색인을 새로 고치려고합니다.Lucene 색인에서 문서를 업데이트 할 때 OutOfMemoryErrors를 피하는 방법은 무엇입니까?
변경된 문서를 업데이트하려면 IndexWriter.deleteDocuments(Query)
을 사용하여 해당 문서를 삭제 한 다음 IndexWriter.addDocument()
을 사용하여 업데이트 된 문서를 추가합니다.
IndexWriter.deleteDocuments
에 사용 된 Query
개체는 약 12-15 개의 용어를 포함합니다. 인덱스를 새로 고치는 과정에서 때때로 IndexWriter.deleteDocuments
을 사용하여 모든 문서를 삭제 한 다음 새 문서를 추가하여 FULL 새로 고침을 수행해야합니다.
문제는 약 100000 개의 문서 삭제 후 IndexWriter.flush()
을 호출하면 실행하는 데 오랜 시간이 걸리고 OutOfMemoryError
을 던집니다. 플러싱을 사용 중지하면 색인 생성이 빠르게 진행되어 2000000 개의 문서를 삭제 한 다음 OutOfMemoryError
을 던집니다. 메모리 부족 오류를 피하기 위해 IndexWriter.setRAMBufferSizeMB
을 500으로 설정하려고했지만 운이 없었습니다. 색인 크기는 1.8GB입니다.
JVM 최대 메모리 힙 크기를 12G로 설정합니다. 나는 또한'IndexWriter.expungeDeletes (boolean)'호출을 시도해 보았다. flush 호출 후 삭제 된 documents.But과 관련된 인덱스의 사용되지 않는 모든 데이터가 제거되었다.하지만 여전히 OOM이 발생한다. 나는 왜 1.8 GB 색인 문서 삭제가 12 GB 메모리를 모두 소비하는지에 놀랐다. – JP10
들여다 보았습니까? 그것은 실제로 그 모든 기억을 소비합니까? ... 나는 그것을 의심한다. jvisualvm을 사용하고, 수동 GC를 수행하고 남아있는 것을 확인하십시오. –
추가 : 메모리에 문제가 없으면 내 답변이 더 이상 필요하지 않습니다. 그런 다음 삭제할 수 있습니다. 어쨌든 나는 Lucene이 100k 문서를 삭제하는 것이 왜 문제가되는지 이해하는 데 어려움이있다. Lucene 친구들은 내가 그와 같은 것을 물어 보면 엄청나게 작은 숫자라고 말할 것입니다 : -/ –