Entwickler-Ecke
Basistechnologien - nicht benoetigten Speicher freigeben
Stephan202 - Do 04.08.11 13:06
Titel: nicht benoetigten Speicher freigeben
Hallo,
ich verwende eine Funktion, die einmal fuer sich angewendet, problemlos laeuft.
Wenn diese jedoch vielfach hintereinander aufgerufen wird, laeuft der
RAM-Speicher voll. Ich bin nicht sicher, ob es wirklich an dieser Funktion liegt,
zumindest habe ich sie aber im Verdacht.
Gibt es an dieser irgendwas (Handle, Variable), das nach Verwenden der Funktion ausser der uebergebenen Variablen im Speicher verbleibt? Grundsaetzlich nahm ich bis dato an, dass nach Funktionsgebrauch alle funktionsinternen Variablen automatisch
aus dem Speicher geloescht werden, die nicht an die aufrufende Prozedur uebergeben wurden.
Hier ist die besagte Funktion:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| public string[,] tabelle(string pfad, string trennzeichen) { string[,] table={{"",""},{"",""}}; try { string[] fileContent = File.ReadAllLines(pfad); int linecount=fileContent.GetLength(0); string[] datensatz=Regex.Split(fileContent[0], trennzeichen); int rowcount=0; foreach (string wort in datensatz) {rowcount++;} table = new string[linecount,rowcount]; string zeile; for (int i = 0; i < linecount; i++) { zeile=fileContent[i]; datensatz=Regex.Split(zeile, trennzeichen); int j =0; foreach (string wort in datensatz) { table[i,j]=datensatz[j]; j=j+1; } } } catch (System.Exception excep) { MessageBox.Show(excep.Message); } return table; } |
Besten Dank schon im Vorraus fuer Eure Hilfe!
Moderiert von
Th69: C#-Tags hinzugefügt
bakachan - Do 04.08.11 13:18
Bist du dir sicher das du mit deinen ganzen Arrays nicht an die Speichergrenze kommst?
Man kann den GC auch von Hand anschmeissen
dark-destination1988 - Do 04.08.11 13:19
C#-Quelltext
1: 2:
| foreach (string wort in datensatz) {rowcount++;} |
ist bisl sinnlos datensatz.Length sollte das auf einen schlag lösen ;)
c#ler - Do 04.08.11 15:40
Vielleicht eine Allocate Memory funktion einbauen. Mit der müsstest du auch überprüfen können, ob bereits gleiche Daten im Speicher vorhanden sind und diese ggf. terminieren
Aber ist mehr vermutung als gekonnt.
Ich nutze alloc memory bei einem Datenbankgesteuerten Programm, dass auf einer mobilplattform läuft (wenig Speicher vorhanden)
Yogu - Do 04.08.11 20:22
Kleiner Hinweis: Row heißt Zeile und nicht Spalte. Das war Column. Das hat mich auf den ersten Blick ziemlich verwirrt.
Du hast innerhalb der Methode zwei große Arrays: Das mit den Zeilen, und die Tabelle. Das Zeilen-Array sollte auch freigegeben werden, wenn die Methode beendet ist - aber das Tabellen-Array ist genauso groß. Wie verwendest du das denn weiter? Ich denke eher, dass das den Speicherverbrauch verursacht.
Stephan202 - Fr 05.08.11 00:27
@bakachan:
Im "normalen Betrieb" habe ich keine Speicherplatzprobleme mit den Arrays.
Nur wenn diese innerhalb einer Prozedur zur Parameteroptierung benutzt werden,
haengt sich er Rechner auf. Irgendwas scheint sich da zu akkumulieren.
Das Tabellenarray hat ca. 7000 Zeilen und 5 Spalten.
@yogu: das Zeilenarray koennte ich tatsaechlich nach Benutzung freigeben.
Wie sieht der exakte Befehl dafuer aus?
Aber: Passiert das nicht automatisch, wenn die Funktion verlassen wird?
Das ganze wird dann so weiterverwendet, dass das Tabellenarray nach einem bestimmten Wert (Datum) in der ersten Spalte durchsucht und
der dazugehoerige Wert einer anderen Spalte ausgegeben wird. Das passiert solange immer wieder, bis das Hauptprogramm beendet ist.
@ dark-destination1988: stimmt, hab ich gar nicht dran gedacht
an alle: Stimmt es, dass Streamreader effizienter ist als die Syntax, die ich nutze und weniger Speicher frisst?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!