Laden...

Out Of Memory - Was könnte es sein?

Erstellt von Stefank vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.150 Views
S
Stefank Themenstarter:in
6 Beiträge seit 2013
vor 11 Jahren
Out Of Memory - Was könnte es sein?

Hallo,

ich betreibe einen C# Video Converter, dieser wird über eine Webschnittstelle angesprochen.

Jeder Convert wird einem Ticket zugewießen, da das ganze gleichzeitig passieren soll, muss natürlich threading her.

Ein Ticket läuft so ab:

  • Download
  • Convert
  • Ready

Allerdings können natürlich Fehler aufkommen und dann findet ein ErrorParsing statt. Jetzt das lustige: Nach 1-8 Stunden, wenn ca 1000 - 5000 Tickets abgearbeitet wurden, kommt die Fehlermeldung "Out Of Memory" - gut dann hab ich mir gedacht, die Tickets sind noch im Speicher - sind sie tatsächlich, die werden nämlich in einer List gespeichert - gut, ich lösche nach 15 Minuten nach der Erstellung das Item in der List, versuche es an einem Tag nochmal. Selber Fehler. Gut, dann habe ich es mir "IDisposable" versucht - selber Fehler.

Was mir aufgefallen ist, dass damals bis 1200mb Arbeitsspeicher geschafft hat, seit dem ich das mit dem IDisposable versucht habe, ist er schon bei 300mb abgeschmiert mit der oben genannten Fehlermeldung.

Also was mach ich falsch? Wieso wird Speicher nicht freigegeben, wenn ich das Ticket = null setze, wieeeso?

Dabei muss man noch sagen, dass im Ticket noch unterklassen sind, werden die auch auf null gesetzt, wenn ich die klasse, in der das Object Instanz ist, auch auf null gesetzt?

Was könnte es noch sein? Kann man irgendwie auslesen, WIESo und WAS alles im Speicher von der Application ist? Ich habe jetzt seit knapp einer Woche jeden Abend versucht diese Fehler zu beheben - leider erfolglos.

Im Grunde dachte ich es liegt an den Threads - den pro Ticket => ein Thread. Weil es ja "automatisch" starten soll, der komplette Prozess, ohne die anderen Tickets zu berücksichtigen. Gibt es hier eine alternative für Threads? Was kann ich anwenden?

Freundliche Grüße vom verzweifelten WebEntwickler, der mal nach 4 Jahren C#.NET Pause mal wieder was in .NET programmieren wollte...

F
115 Beiträge seit 2012
vor 11 Jahren

Hi,

das Thema ist nicht ganz trivial und hat nicht zwigend mit der Menge, sondern der Fragmentierung des Speichers zu tun. Siehe auch

Verhindern einer OutOfMemoryException, wenn die Datei als ganzes zu groß für den Hauptspeicher ist

Als Hintergrundinfo empfehle ich diese Artikel

http://blogs.msdn.com/b/tess/archive/2006/09/06/net-memory-usage-a-restaurant-analogy.aspx
http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

Ich könnte mir vorstellen, dass es in Deinem Fall hilft, wenn Du beim Auftreten des Fehlers darauf wartest, dass alle Threads fertig sind und dann dem GC die Chance gibst, den freien Speicher wieder zu einem Chunk zusammenzuschieben.

Einige Mitmenschen berichten auch von einer Verbesserung durch 64bit.

Gruß
f_igy

16.842 Beiträge seit 2008
vor 11 Jahren

Wenn Du ein Thread erstellst wird direkt Speicher allokiert. Zu viele Threads zeitgleich -> es kracht!
Du aber musst dafür sorgen, dass dies niemals passieren kann.

Insgesamt hört sich das für mich so an, dass Du Dir mit dem Them Multithreading nicht 100%tig sicher bist - das muss man aber sein, wenn man damit zuverlässig arbeiten will => [Artikel] Multi-Threaded Programmierung

Im Prinzip ist alles, was damit zutun hat, eine Queue.
Du selbst bestimmt, wie viele Consumer-Threads es gibt, also wie viele Tickets zeitgleich bearbeitet werden. Sind es mehr wirds einfach in eine Warteschlange geschoben statt direkt zu starten und damit das System instabil zu machen.
In diesem Zusammenhang wäre die BlockingCollection das richtige.

Ansonsten können viele Dinge ein Out of Memory auslösen, zB wenn zu viele Filehandles offen sind etc.

Lern also, wie man korrekt mit Threads und Queues umgeht, dass man Hilfsklassen verwendet, dass man Kapselt etc und dann wirst Du wahrscheinlich um eine strukturelle Änderung Deiner Anwendung nicht herum kommen.

849 Beiträge seit 2006
vor 11 Jahren

Hi,

wenn ich in solche Fehler laufe, benutze ich meist den CLR-Profiler

Hin und wieder kann man mehrere Tage nach solchen Sachen suchen, um dann immer noch kein Ergebnis zu haben und festzustellen das man seinen Code komplett verunstaltet hat.
Der Profiler bringt einen dann meist recht schnell auf nicht freigegebene Resourcen. Oder wie es schon mehrmals vorgekommen ist, auf Leaks in Fremdkomponenten.

Natürlich muss man auch ersteinmal Lernen diesen richtig zu bedienen und zu lesen.

Grüße