У меня есть живой индекс Lucene, который обновляется в течение дня. Когда поступит несколько последовательных пакетов обновлений для индекса, я хочу, чтобы эти обновления были доступны для поиска как можно быстрее. Поэтому мне нужно пересоздать IndexSearcher.
Проблема в том, что IndexSearcher может занимать около 100 МБ памяти, а когда поступает много обновлений, он может создаваться сравнительно часто, и я заметил, что сборщик мусора .Net медленно очищает ссылку на старый объект IndexSearcher. Это приводит к тому, что использование памяти процессом выходит из-под контроля, поскольку сборщик, похоже, освобождает память от старых IndexSearchers медленнее, чем они воссоздаются.
Я обнаружил, что эту проблему можно решить путем пересечения линии на территорию табу и вызова GC.Collect()
, что немедленно освобождает память. Влияние на производительность не кажется заметным, но, поскольку я делаю что-то, против чего много советов, мне было бы любопытно, если бы кто-то еще имел опыт создания и выпуска объектов быстрее, чем сборщик мусора их очищает. Мне было бы особенно интересно, если бы у кого-то была такая проблема с Lucene IndexSearcher.
Я должен отметить, что IndexSearcher воссоздается в пиковое время примерно каждые 10-20 секунд.