Laden...

WPF Applikation wird langsamer, je mehr Speicher sie reserviert hat

Erstellt von Christoph K. vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.132 Views
Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 7 Jahren
WPF Applikation wird langsamer, je mehr Speicher sie reserviert hat

Hallo zusammen,

ich habe eine WPF-Applikation, die ziemlich viele im Arbeitsspeicher hält. Das Problem ist, dass die ganze Applikation immer langsamer wird, je mehr Daten gehalten werden, ohne das diese Daten direkt etwas mit der Laufzeit zu tun haben.

Im Moment ist es so, dass ab ca. 4GB kaum noch zügiges Arbeiten möglich ist.
Weiß jemand woran das liegt ?

16.842 Beiträge seit 2008
vor 7 Jahren

Selbst aufwändige Grafikanwendungen und Games halten keine 4 GB im RAM.
Darf man fragen, was Du da machst?

Und woher weisst Du, dass der Speicher das Problem ist?
Hast Du entsprechend schon einen Profiler genutzt, oder isses eher ne Vermutung?

Aber allgemein: mehr Speicher deutet auf mehr Items hin, und zB. eine Iteration über immer mehr Items kostet natürlich auch immer mehr Zeit.
Sollte logisch sein.

Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 7 Jahren

Ich analysiere Webseiten und muss viele Daten im Speicher halten, da es teilweise nötig ist, URL-Bezüge herzustellen.

Ich habe den RedGate-Profiler und das Laufzeitverhalten analysiert. Dieser weißt mir jedoch die teuersten Pfade in bereichen auf, die autoag laufen, ohne mit den großen Datenlisten zu arbeiten.

W
872 Beiträge seit 2005
vor 7 Jahren

Ich würde mal mit Visual Studio probieren, Dump Files anzuschauen.
Using Dump files.

Hast Du mal mit dem Code Analyser auf Deinen Code losgelassen - vielleicht bekommst Du da noch Empfehlungen Richtung IDisposable.

849 Beiträge seit 2006
vor 7 Jahren

Startest Du die Anwendung noch im Debug Modus? Um die Performance zu beurteilen solltest Du auf jeden Fall ohne angehängten Debugger und Release (optimize Code) arbeiten.

Auch solltest Du wissen das wenn Listen erweitert werden, diese im Speicher auch hin und wieder neu im Arbeitsspeicher positioniert werden. Das kostet auch Zeit.

Aber ohne zusätzliche Informationen ist es auch eher ein stochern im Dunkeln 😉

P
1.090 Beiträge seit 2011
vor 7 Jahren

Schau mal ob viele Full GCs durch geführt werde (Wenn du viele Objekte im Speicher hast dauern, die Länge). Wenn ja such mal bei dir im Code ob da irgendwo GC.Collect aufgerufen wird.

p.s.
4GB am Webseiten ist auch schon eine ganze Menge. Ich würde mal schauen, ob es da keinen Besseren Ansatz, wie sie Vielleicht zwischen zu speichern. Und bei bedarf zu laden.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

T
2.224 Beiträge seit 2008
vor 7 Jahren

Blöde Frage aber was spricht dagegen den Speicher zu entlasten in dem du deine Daten in einer embedded DB wie Sqlite zwischen speicherst?
Gerabde bei Anwendungen die riesige Datenmengen bearbeiten müssen, macht es Sinn solche Daten per Serialisierung zwischen zu speichern und bei bedarf abzurufen.
Entweder per embedded DB oder eben per XML oder anderer Art der Serialisierung!

Nachtrag:
Da ich vermute, dass du einige Seiten abgrasst und dabei den Content der Seiten im RAM hälst, dürfte das dein Speicherproblem sein!
Der GC versucht dann quasi erfolglos deinen RAM zu säubern und kopiert dann einen 2 GB Block in dem deine Daten liegen hin und her.
Das bremst deine Anwendung vermutlich schön aus, da der GC keine Daten aus dem RAM löschen kann und deshalb enorme Mengen an Speicher durchlaufen und kopieren muss.

Hier kannst du nur durch Zwischenspeichern in einer DB oder eben per Serialisierung(Ordner pro Url mit Textdatei für den Content) deinen RAM frei räumen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.