/ / Was tun, wenn die .Net-Speicherbereinigung langsamer ist als die Geschwindigkeit, mit der Objekte erstellt / gelöscht werden? - .net, Müllsammlung, Lucene, Lucene.net

Was ist zu tun, wenn die .Net-Speicherbereinigung langsamer ist als die Rate, mit der Objekte erstellt / gelöscht werden? - .net, Müllsammlung, Lucene, lucene.net

Ich habe einen Live-Lucene-Index, der aktualisiert wirdim Laufe des Tages. Wenn mehrere aufeinanderfolgende Stapel von Aktualisierungen für den Index durchlaufen werden, möchte ich, dass diese Aktualisierungen für eine möglichst schnelle Suche verfügbar sind. Deshalb muss ich den IndexSearcher neu erstellen.

Das Problem ist, dass der IndexSearcher es aufnehmen kann100 MB Speicher und wenn viele Aktualisierungen durchgeführt werden, können sie relativ oft neu erstellt werden, und ich habe bemerkt, dass der .Net-Garbage Collector den Verweis auf das alte IndexSearcher-Objekt langsam zu bereinigen scheint Der Prozess gerät außer Kontrolle, da der Collector langsamer Speicher für alte IndexSearcher freisetzt, als er neu erstellt wird.

Ich habe festgestellt, dass dieses Problem dadurch gemindert wird, dass man die Grenze in Tabu-Territorien überschreitet und aufruft GC.Collect(), wodurch der Speicher sofort freigegeben wird. Die Auswirkungen auf die Leistung scheinen nicht spürbar zu sein, aber da ich etwas unternehme, gegen das viele Ratschläge ablehnen, wäre ich neugierig, ob jemand anderes Erfahrung damit hat, dass Objekte schneller erstellt und freigegeben werden, als der Müllsammler sie sauber macht. Es wäre besonders interessant, wenn jemand dieses Problem mit dem Lucene IndexSearcher hatte.

Ich sollte beachten, dass der IndexSearcher alle 10-20 Sekunden zu Spitzenzeiten neu erstellt wird.

Antworten:

3 für die Antwort № 1

Ich halte es für akzeptabel, anzurufen GC.Collect wenn Sie gerade eine Tonne Speicher freigegeben haben, und dieSpeicher kann und sollte jetzt freigegeben werden, um den Speicherdruck zu reduzieren. Der GC weiß nicht, dass dieser Speicher jetzt verfügbar ist, bis er erneut ausgeführt wird, und Sie wissen nicht, wann dies geschehen wird.

In Ihrem Fall haben Sie gesagt "es kann relativ oft neu erstellt werden". Wenn ja, anrufen GC.Collect Wenn Sie neu erstellen, klingt das vernünftig.


2 für die Antwort № 2

Haben Sie versucht, die Garbage Collection für den Server zu konfigurieren? Ich glaube es unterscheidet sich darin, dass sich GC in einem anderen Thread befindet:

Sollen wir "Workstation" Garbage Collection oder "Server" Garbage Collection verwenden?

Wie für "schneller als das Aufräumen", wenn Speicherist verfügbar, dann wird das System es Ihrem Prozess gewähren. Der Speicherbereiniger sammelt sich an verschiedenen Knotenpunkten, wenn der Speicher wächst, er stoppt jedoch keine Zuordnungen, um einen bestimmten Speicherdruck aufrechtzuerhalten - das Betriebssystem verwaltet den Druck.

Leider habe ich keine direkten Erfahrungen mit Lucene, daher geht es in der Regel nur um die Müllsammlung.