OutOfMemoryException

  • VB.NET
  • .NET 7–8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    OutOfMemoryException

    Moin,

    ich serialisiere mehrere Xml Dateien und behalte den Inhalt im Speicher, um schnell darauf zuzugreifen. Die gesamten Dateien brauchen laut Taskmanager und Statusmonitor in VS etwa 600 MB. Dateigröße sind etwa 250 MB.
    Funktioniert soweit auch alles, allerdings kommen nun auch noch Daten aus einer Datenbank hinzu. Dies sind etwa 390.000 Datensätze (viele leere Felder, die nicht benötigt werden) und verbrauchen etwa 220 - 250 MB je nach Menge.

    Es ist eine 32 Bit Anwendung, was auch nicht zu ändern ist, da ich über Oledb auf eine Access-Datenbank (auf den PCs als 32 Bit installiert, auch nicht zu ändern) zugreife.
    Theoretisch können 32 Bit Anwendungen ja bis zu 2 GB Speicher verbrauchen, daher wundert es mich, dass ich die Exception schon bei etwas über 800 MB bekomme.

    Auch das manuelle Anstoßen des GarbageCollectors mit GC.Collect hilft nicht.

    Was kann man tun?

    Grüße :)
    Kann es sein, dass Du Daten mehrfach im RAM ablegst?
    Steppe mal durch und beobachte dabei die Speicherauslastung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe ich überprüft, liegt alles definitiv nur einmal im Ram.
    Steps hab ich auch ausgeführt und jeweils vor und nach dem Laden der Daten über

    Quellcode

    1. My.Computer.Info.AvailablePhysicalMemory
    den aktuellen Arbeitsspeicher verglichen.
    Ist kein genauer Wert, da es halt nicht der Speicherverbrauch speziell für das Programm ist, aber bei etwa 20 Tests kamen die oben ermittelten Werte als Mittel raus.

    Ach und bevor ich es vergesse, Windows 10 64, 32 GB Ram und es ist wirklich noch genug Speicher frei :)
    Wenn die Daten im Speicher blöd fragmentiert sind, mit Lücken, die nicht richtig genutzt werden können, kann das schon mal früher kommen. Aber in den neueren .NET Versionen kannst du den GC mit compacting dazu veranlassen das etwas aufzuräumen. Vielleicht hilft das.

    C#-Quellcode

    1. GC.Collect(GC.MaxGeneration, GCCollectionMode.Aggressive, true, true);
    2. GC.WaitForPendingFinalizers();
    Nicht

    BlueLagoonX schrieb:

    VB.NET-Quellcode

    1. My.Computer.Info.AvailablePhysicalMemory
    sondern
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!