Speicherfresser finden

04/03/2008 - 17:45 von Ralf | Report spam
Hallo zusammen!

Ich habe mit Framework 2.0 einen Windows Service geschrieben, der Daten aus
einer CSV-Datei in einen SQL Server transportiert. Leider ist das CSV nicht
schön formatiert sondern verstößt gegen jede gute Sitte, deshalb keine
Import-Tools aus dem SQL Server sondern "handgemacht".

Wàhrend der Laufzeit belegt der Service bis zum 250 MB RAM für ein Dataset
(groß, etliche Tabellen, einige mit 50.000-100.000 Zeilen) - das geht schon
in Ordnung.

Wenn aber eine Datei abgeschlossen wurde und der Importer wieder in den
Ruhezustand geht (wie gesagt, Windows-Service, làuft permanent, arbeitet
aber nur wenn er neue Dateien findet) gibt der den Speicher nicht wieder
frei: Beim Start belegt er ca. 10 MB und bleibt auch da. Wenn aber die erste
Datei làuft springt der auf etliche hundert MB (auch OK) - aber kommt nicht
mehr zurück zu den 10 MB die er im Leerlauf eigentlich nur benötigt.

Auf dem Rechner làuft ein SQL Server und ein SQL Analysis Server, die beide
gerne diese 100-200 MB nutzen würden, deshalb ist mir das schon wichtig.

Am Ende meiner Routinen schliesse (.Close) ich alle Resourcen (File Handles)
danach setzte ich alle anderen Sachen (Datasets usw.) = Nothing, dann noch
gc.collect und verlasse auch noch die Prozedur die alle die Variablen
definiert und belegt... trotzdem bekomme ich den Speicher nicht frei.


Deshalb meine Frage: Gibt's die Möglichkeit, über Framework, Reflection, den
Application Pool oder andere Vorgehensweisen rauszufinden, welche Variablen
noch Speicher belegen? Wie gesagt, die Prozedur die die Variablen definiert
ist verlassen, spàtestens dann sollte doch der Speicher zurückkommen... tut
er aber nicht. Wenn ich wüßte auf welche Variable (Name) noch Speicher
geblockt ist könnte ich suchen warum...

Irgendeine Idee / Vorschlag?
Danke!

Ralf
 

Lesen sie die antworten

#1 Thomas Scheidegger
04/03/2008 - 19:25 | Warnen spam
Hallo Ralf


Beim Start belegt er ca. 10 MB und bleibt auch da. Wenn aber die erste
Datei làuft springt der auf etliche hundert MB (auch OK) - aber kommt
nicht mehr zurück zu den 10 MB die er im Leerlauf eigentlich nur benötigt.



dieser Anfangswert wird (ohne Win32-Tricks) vermutlich nie mehr erreichbar
sein.
Typ. Werte um 50..100MB müssten noch tolerierbar sein...


ein SQL Server und ein SQL Analysis Server, die beide gerne diese 100-200
MB nutzen würden



.NET (wie eigentlich typ. Win32-Apps) nutzt primàr virtuellen Speicher,
dies ist _keine_ feste Belegung von RAM.
Echtes RAM wird vom OS nach Bedarf automatisch/bevorzugt unter den 'aktiven'
Apps verteilt.



schliesse (.Close) ich alle Resourcen (File Handles)
danach setzte ich alle anderen Sachen (Datasets usw.) = Nothing



das Nothing ist meist eher nebensàchlich,
viel wichtiger Close/Dispose aller DB-Objekte/Connections uà, wo mögl.!


Tools zur GC Analyse:
<URL:http://www.microsoft.com/downloads/...AA0CD0>
setzt zur korrekten Interpretation aber einiges an Know-How voraus.



Thomas Scheidegger - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

Ähnliche fragen