Как использовать RAMDirectory и избежать OutOfMemoryException, если размер объекта превышает 2 ГБ

Я помещаю весь свой индекс в память, используя RAMDirectory чтобы улучшить производительность, и это работало прекрасно, пока мой индекс не рос и рос. Теперь я получаю OutOfMemoryException, Хотя мой индекс на диске равен 1,24 ГБ, я подозреваю, что размер объекта RAMDirectory объект превышает допустимый размер объекта.NET 2 ГБ, и, следовательно, генерируется исключение. Другая причина может заключаться в том, что виртуальное адресное пространство просто слишком фрагментировано, чтобы найти достаточно большую дыру для моего объекта.

Я хотел бы продолжать использовать RAMDirectory, Как я могу сделать это, избегая OutOfMemoryException?

Обратите также внимание, что когда я пишу свой индекс, я звоню IndexWriter.Optimize поэтому весь индекс находится в одном большом файле.

1 ответ

Решение

Единственный способ продолжать использовать RAMDirectory Я могу думать о том, чтобы разделить его на несколько меньших индексов и использовать MultiSearcher,

Таким образом, вы сможете избежать ограничения размера объекта.NET 2 ГБ, обратите внимание, что даже на 64-битном одном объекте по-прежнему существует ограничение размера 2 ГБ, RamDirectory внутренне содержит массив байтов для представления индекса, и это, вероятно, делает его взорвать, если он слишком большой.

По моему скромному мнению, вам, вероятно, следует подумать об использовании FSDirectory с большими индексами, скорость которого обычно достаточно хороша для большинства приложений после прогрева.

Другие вопросы по тегам