我正在嘗試刷新增量模式下的Lucene索引,該模式正在更新已更改的文檔並將其他未更改的文檔保持原樣。如何在Lucene索引中更新文檔時避免OutOfMemoryErrors?
爲了更新已更改的文檔,我使用IndexWriter.deleteDocuments(Query)
刪除這些文檔,然後使用IndexWriter.addDocument()
添加更新的文檔。
用於IndexWriter.deleteDocuments
的Query
對象包含大約12-15個術語。在刷新索引的過程中,我有時還需要使用IndexWriter.deleteDocuments
刪除所有文檔,然後添加新文檔來進行全面刷新。
問題是當我說在調用約100000個文檔刪除之後調用IndexWriter.flush()
時,執行並拋出OutOfMemoryError
需要很長時間。如果我禁用了刷新功能,那麼索引就會快速上升到2000000個文檔刪除,然後它會拋出一個OutOfMemoryError
。我試圖將IndexWriter.setRAMBufferSizeMB
設置爲500以避免內存不足錯誤,但是沒有運氣。索引大小爲1.8 GB。
我將JVM最大內存堆大小設置爲12G。我也曾嘗試在刷新調用後調用'IndexWriter.expungeDeletes(boolean)',我想刪除與已刪除文檔關聯的索引中的所有未使用的數據。但仍會出現OOM。我很驚訝爲什麼1.8 GB的索引文件刪除會佔用全部12 GB的內存。 – JP10
你看過它嗎?它是否真的消耗了所有的內存? ... 我對此表示懷疑。使用jvisualvm,執行手動GC並查看剩下的內容。 –
添加:如果您確實沒有內存問題,我的回答已過時,則我可以刪除它。無論如何,我仍然很難理解爲什麼刪除100k文檔對Lucene來說應該是個問題。 Lucene的人會說這是一個可笑的小數字,如果我問他們這樣的事情: -/ –