Как использовать RAMDirectory и избежать OutOfMemoryException, если размер объекта превышает 2 ГБ
Я помещаю весь свой индекс в память, используя RAMDirectory
чтобы улучшить производительность, и это работало прекрасно, пока мой индекс не рос и рос. Теперь я получаю OutOfMemoryException
, Хотя мой индекс на диске равен 1,24 ГБ, я подозреваю, что размер объекта RAMDirectory
объект превышает допустимый размер объекта.NET 2 ГБ, и, следовательно, генерируется исключение. Другая причина может заключаться в том, что виртуальное адресное пространство просто слишком фрагментировано, чтобы найти достаточно большую дыру для моего объекта.
Я хотел бы продолжать использовать RAMDirectory
, Как я могу сделать это, избегая OutOfMemoryException
?
Обратите также внимание, что когда я пишу свой индекс, я звоню IndexWriter.Optimize
поэтому весь индекс находится в одном большом файле.
1 ответ
Единственный способ продолжать использовать RAMDirectory
Я могу думать о том, чтобы разделить его на несколько меньших индексов и использовать MultiSearcher
,
Таким образом, вы сможете избежать ограничения размера объекта.NET 2 ГБ, обратите внимание, что даже на 64-битном одном объекте по-прежнему существует ограничение размера 2 ГБ, RamDirectory внутренне содержит массив байтов для представления индекса, и это, вероятно, делает его взорвать, если он слишком большой.
По моему скромному мнению, вам, вероятно, следует подумать об использовании FSDirectory с большими индексами, скорость которого обычно достаточно хороша для большинства приложений после прогрева.