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