Как использовать RAMDirectory и избежать OutOfMemoryException, если размер объекта превышает 2 ГБ - PullRequest
0 голосов
/ 06 декабря 2011

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

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

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

1 Ответ

2 голосов
/ 06 декабря 2011

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

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

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

...